E - Leading and Trailing Light oj 1282
讲道理应该算一道水题;
但是因为有个东西不知道,导致做不出;
求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;
}