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 }