码迷,mamicode.com
首页 > 其他好文 > 详细

LightOJ - 1282 Leading and Trailing(数学题)

时间:2017-09-08 21:43:47      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:using   rail   ++   include   fast   cas   pow   strong   log   

题目链接:点我点我

题意:给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(数学题)

标签:using   rail   ++   include   fast   cas   pow   strong   log   

原文地址:http://www.cnblogs.com/Leonard-/p/7496292.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!