LightOJ - 1282 Leading and Trailing(數學題)
阿新 • • 發佈:2017-09-08
math lld lin return case 次方 targe long 再處理
題目鏈接:點我點我
題意:給n,k,求nk的前三位和後三位。
題解:後三位直接快速冪。前三位的話,我們假設n=10a,nk=10a*k=10x+y=10x * 10y。
我們把10x當做位數(就是讓他它盡可能大,比如n的k次方為12345,10x就相當於104),10y當做表示的值(12345這個數,它的10y就是1.2345)。
我們把這個10y求出來就可以了,最後再乘上100,強制轉換一下,就得到前三位了。但是要怎麽求呢。這就要用到之前的公式:
nk=10x+y <=> k*log10 n=x+y,因為這時候的y是個小數(就比如說10y是1.2345,y取值顯然是 0<y<1),y=double(k*log 10 n)- LL(k*log10 n)。
y都求出來了,最後再處理一下就可以了。註意:沒有三位的要加前導0.
1 #include <cmath> 2 #include <cstdio> 3 using namespace std; 4 5 typedef long long LL; 6 LL fast_mod(LL x,LL n,LL mod){ 7 LL ans=1; 8 while(n>0){ 9 if(n&1) ans=(ans*x)%mod; 10 x=(x*x)%mod;11 n>>=1; 12 } 13 return ans; 14 } 15 16 int main(){ 17 LL t,n,k,Case=1; 18 scanf("%lld",&t); 19 while(t--){ 20 scanf("%lld %lld",&n,&k); 21 double x=1.0*k*log10(n*1.0); 22 x=x-LL(x); 23 LL y=fast_mod(n,k,1000); 24 printf("Case %lld: %03lld %03lld\n",Case++,(LL)(pow(10,x)*100),y); 25 } 26 return 0; 27 }
LightOJ - 1282 Leading and Trailing(數學題)