Hướng dẫn giải của Lũy thừa
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
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; }
Bình luận