题目:http://uva.onlinejudge.org/external/110/11029.pdf
题意:给出n和k,计算n^k的前三位和后三位数字。0<n<2^31,0<k<10000001。
分析:令x=log10(n^k),变形有x=k*log10(n),那么x的值为p0.p1p2p3p4p5........,其中p0+1就是n^k的位数,n^k=(10^p0)*(10^0.p1p2p3p4p5.....),只需计算10^0.p1p2p3p4p5......就可以得到n^k的前几项。而后几项用快速幂可以求出。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
#define MOD 1000
LL kpow(LL a,LL n)
{
LL ans=1;
while(n)
{
if(n&1)
ans=(ans*a)%MOD;
n>>=1;
a=(a*a)%MOD;
}
return ans;
}
int main()
{
int ncase;
LL a,n;
scanf("%d",&ncase);
while(ncase--)
{
scanf("%lld%lld",&a,&n);
double x=n*log10(a);
LL t=x;
double v=x-t;
v=pow(10,v);
LL y=kpow(a,n);
if(y<10)
cout<<floor(v*100)<<"...00"<<y<<"\n";
else if(y<100)
cout<<floor(v*100)<<"...0"<<y<<"\n";
else
cout<<floor(v*100)<<"..."<<y<<"\n";
}
return 0;
}