求最后的三位,可以通过直接取余得到;
求前三位则需要一些数学知识对于给定的一个数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,就得到了它的前三位。
#include <algorithm>
#include <cassert>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <stack>
#include <set>
#include <string>
#include <ctime>
using namespace std;
#define ll long long
int pow_mod(int n,int k,int mod)
{
int res=1;
while(k)
{
if(k&1)
res=res*n%mod;
n=n*n%mod;
k>>=1;
}
return res%mod;
}
int main()
{
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
for(int cas=1;cas<=T;cas++)
{
int n,k;
scanf("%d %d",&n,&k);
int low=pow_mod(n%1000,k,1000);
int high=pow(10,2+fmod(k*log10(n),1));
printf("Case %d: %03d %03d\n",cas,high,low);//这里,一定要控制位数……防止0(000)等情况出现
}
return 0;
}