Editorial for Lũy thừa
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này
Code mẫu của flashmt
var a,b:int64; j,k,i,t:longint; t1,b1,k1:real; begin READLN(t); FOR i:=1 TO t DO begin readln(a,b); b1:=b; k1:=ln(b1)/ln(2); k:=trunc(k1); for j:=k downto 1 do begin t1:=exp(1/j*ln(b)); t1:=trunc(t1); if exp(j*ln(t1))>=a then break; end; writeln('Case #',i,': ',j); end; end.
Code mẫu của RR
{$R+,Q+} const oo=1000000000000; max:array[1..40] of int64= (oo,1000000,10000,1000,252,100,52,32,22,16,13,10,9,8,7,6,6,5,5,4,4,4,4,4,4,3, 3,3,3,3,3,3,3,3,3,3,3,3,3,2); var k,x,y:int64; test,t:longint; function power(x,k:int64):int64; var kq,m:int64; begin if k=0 then exit(1) else if k=1 then exit(x); m:=k div 2; kq:=power(x,m); kq:=kq*kq; if k mod 2=0 then exit(kq) else exit(kq*x); end; procedure solve; var l,r,mid,p:int64; kk:longint; begin for kk:=40 downto 1 do begin l:=1; r:=max[kk]+1; if kk=12 then begin write(''); end; repeat mid:=(l+r) div 2; p:=power(mid,kk); if (x<=p) and (p<=y) then begin k:=kk; exit; end; if p>y then r:=mid else l:=mid; until r-l<=1; end; end; begin readln(t); for test:=1 to t do begin readln(x,y); solve; writeln('Case #',test,': ',k); end; end.
Code mẫu của hieult
#include <stdio.h> #include <math.h> main() { int n,c[10000],x2,y2,v; double a[10000],b[10000],x,y; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%lf",&a[i]); scanf("%lf",&b[i]); } for(int i=0;i<n;i++) { x=a[i]; y=b[i]; x2=0; y2=0; while(x>=1) { x=x/2; x2++; } while(y>=1) { y=y/2; y2++; } if(y2>x2) c[i]=y2-1; else { for(int j=y2-1;j>0;j--) { v=int(pow(b[i]+0.1,1./j)); if(a[i]<=pow(v,j)&&pow(v,j)<=b[i]) { c[i]=j; break; } } } } for(int i=0;i<n;i++) printf("Case #%d: %d\n",i+1,c[i]); }
Code mẫu của ll931110
{$N+} {$MODE DELPHI} program POWER; const input = ''; output = ''; maxk = 40; eps = 0.00001; var fi,fo: text; l,r: int64; i,nTest: integer; procedure openfile; begin assign(fi, input); reset(fi); assign(fo, output); rewrite(fo); end; procedure solve; var i: integer; t1,t2,k: extended; s1,s2: int64; begin readln(fi, l, r); for i := maxk downto 1 do begin k := 1 / i; t1 := exp(k * ln(l)); s1 := trunc(t1); if t1 - s1 > eps then inc(s1); t2 := exp(k * ln(r)); s2 := trunc(t2); if s2 >= s1 then begin writeln(fo, i); exit; end; end; end; procedure closefile; begin close(fo); close(fi); end; begin openfile; readln(fi, nTest); for i := 1 to nTest do begin write(fo, 'Case #', i, ': '); solve; end; closefile; end.
Code mẫu của khuc_tuan
#include <iostream> #include <cstdio> #include <cmath> using namespace std; int main() { int st, t; scanf("%d", &st); for(t=1;t<=st;++t) { long long L, R; cin >> L >> R; for(int k=40;k>=1;--k) { long long left = 0, right = (long long)(pow( R, 1.0 / k) + 10); while(left<right) { long long mid = (left+right)/2; long long z = 1; for(int i=0;i<k;++i) { z *= mid; if(z>=L) break; } if(z>=L) right = mid; else left = mid+1; } long long z = 1; for(int i=0;i<k;++i) { z *= left; if(z>R) break; } if(L<=z && z<=R) { printf("Case #%d: %d\n", t, k); break; } } } //system("pause"); return 0; }
Comments