1. 程式人生 > >LightOJ - 1282 Leading and Trailing(數學題)

LightOJ - 1282 Leading and Trailing(數學題)

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(數學題)