Leading and Trailing
LightOJ - 1282求n^k的前三位数和后三位数
思路:
后三位数可以想起来快速求幂模板,对n^k求余,后三位即为(n^k)%1000。
前三位数为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,就得到了它的前三位。
注意:fmod函数为求某个数的小数部分
例如fmod(x,1) 求得的是x的小数部分;
#include<stdio.h>
#include<math.h>
const int mod=1000;
typedef long long l1;
l1 pow_mod(l1 x,l1 n) //快速求幂模板,求后三位
{
if(n==0)
return 1;
l1 res=pow_mod(x*x%mod,n/2);
if(n&1)
res=res*x%mod;
return res;
}
int main()
{
int t,tt=1,n,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
// 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,就得到了它的前三位。
//而fmod(x,1)可以求出x的小数部分
//ak=x(整数部分)+y(小数部分);而由n^k=(10^a)^k可求得ak=k*log10(n*1.0);
//故fmod(k*log10(n*1.0),1)即为y
double x=pow(10.0,fmod(k*log10(n*1.0),1));
x*=100.0;//取前三位
int y=pow_mod(n,k);
printf("Case %d: %d %03d\n",tt++,(int)x,y);
}
}