讲道理应该算一道水题;

但是因为有个东西不知道,导致做不出;

求n的k次方前面3位数和后面三位数;

后面三位数用快速幂求;

前面三位数可以用

n^k=x*10^y;

k*log10(n)=log10(x)+y;

又因为y=n^k的位数;

所以

log10(x)=k*log10(n)-(int)k*log10(n);

贴下ac代码

#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int quick_mod(int n,int k)
{
    int ans=1;
    int a=n;
    a%=1000;
    while(k){
    if(k&1)
        ans=ans*a%1000;
    k>>=1;
    a=(a*a)%1000;
    }
    return ans;
}
int main()
{
    //freopen("input.txt","r",stdin);
    int n,k;
    int T;
    cin>>T;
    for(int cas=1;cas<=T;cas++)
    {
        scanf("%d%d",&n,&k);
        double t=k*log10(n*1.0);
        int t1=k*log10(n);
        double x=pow(10,t-t1);
        //printf("%lf %d\n",t,t1);
         long long x1=x*100;
        printf("Case %d: %lld %03d\n",cas,x1,quick_mod(n,k));
    }
    return 0;
}