LightOJ - 1282 Leading and Trailing

题目链接:https://vjudge.net/problem/LightOJ-1282

求后三位我们可以用快速幂取模算出来,但是前三位怎么办呢?

对于任意一个数y,都可以表示为10^x,这实际上就是一个以10为底的指数函数,y = 10^x,所以x = log10(y),这个x就分为整数部分和小数部分。n^k就可以表示为10^xk,我们假设这个 xk 为 a.b ,那么n = 10^a + 10^0.b 这里的10^a影响大小,10^0.b影响精度,我们要取前三位就只需要知道b即可,因为b才会影响精度,所以10^2.b 就是我们的答案,代码如下:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 typedef long long LL;
 5 typedef unsigned long long ULL;
 6 
 7 LL quick_pow(LL a, LL b, LL m){
 8     LL ans = 1;
 9     while(b){
10         if(b&1) ans = ans*a%m;
11         a = a*a%m;
12         b >>= 1;
13     }
14     return ans;
15 }
16 
17 int main(){
18     int T;
19     scanf("%d", &T);
20     for(int ca = 1; ca <= T; ++ca){
21         LL n, k;
22         scanf("%lld%lld", &n, &k);
23         LL a = (LL)pow(10.0, fmod(log10((double)n)*(double)k, 1)+2.0);
24         LL b = quick_pow(n, k, 1000);
25         printf("Case %d: %03lld %03lld\n", ca, a, b);
26     }
27     return 0;
28 }
View Code

 

posted @ 2018-08-09 21:19  DyastySun  阅读(130)  评论(0编辑  收藏  举报