LightOJ - 1282 Leading and Trailing(数学题)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LightOJ - 1282 Leading and Trailing(数学题)相关的知识,希望对你有一定的参考价值。

题目链接:点我点我

题意:给n,k,求nk的前三位和后三位。

题解:后三位直接快速幂。前三位的话,我们假设n=10a,nk=10a*k=10x+y=10* 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*log10 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(数学题)的主要内容,如果未能解决你的问题,请参考以下文章

LightOJ - 1282 -Leading and Trailing

LightOJ - 1282 - Leading and Trailing(数学技巧,快速幂取余)

LightOJ - 1282 Leading and Trailing (数论)

LightOJ - 1282 Leading and Trailing(数学题)

LightOJ 1282 - Leading and Trailing (求n的k次方的前三位数字 后三位)

LightOJ 1282 Leading and Trailing (数学)