题意:
输入n^k,输出n^k的前3位与后3位.
思路:
最后的三位可以直接快速幂取余,但要注意不够要补前导0.
求前三位则需要一些数学知识对于给定的一个数n,它可以写成10^a,其中这个a为浮点数,则n^k=(10^a)^k=10^a*k=(10^x)*(10^y);
其中x,y分别是a*k的整数部分和小数部分对于t=n^k这个数,它的位数由(10^x)决定,它的位数上的值则有(10^y)决定,因此我们
要求t的前三位,只需要将10^y求出,再乘以100,就得到了它的前三位。
fmod(x,1)可以求出x的小数部分
tmp就是上面说的y
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
const ll mod = 1000;
int fast_pow(ll tmp, ll k)
{tmp = tmp % mod;int ans = 1;while(k){if(k&1)ans = (ans*tmp) % mod;k >>= 1;tmp = tmp*tmp % mod;}return ans;
}
int main()
{int T;ll n, k;scanf("%d", &T);for(int kase = 1; kase <= T; kase++){scanf("%lld%lld", &n, &k);int x = (int)pow(10.0, 2.0+fmod(k*log10(1.0*n), 1));int y = fast_pow(n, k);printf("Case %d: %d %03d\n", kase, x, y);}return 0;
}