后三位好想,只要对1000取余只用后三位进行乘方即可。
前三位可能难想点,转换成几点几,然后再乘方取前三位即可。
但是k比较大,会超时。所以用快速幂运算。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
double Convers(double val)
{
while(val>=1000)
val=val/10;
return val;
}
void quickpow(double a,int b,int k,double &fro,int &rear)
{
fro=1.0;
rear=1;
while(k)
{
if(k&1)
{
fro*=a;
fro=Convers(fro);
rear=rear*b%1000;
}
a*=a;
a=Convers(a);
b=b*b%1000;
k=k>>1;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,k;
scanf("%d%d",&n,&k);
double v;
int u;
quickpow(Convers(n),n%1000,k,v,u);
printf("%d...%03d\n",(int)v,u%1000);
}
return 0;
}