题意:
给出两个数,n和k,求n的k次方的前三位和后三位。
分析:
后三位用快速幂取模,模为1000即可。
前三位:一个数可以写成n=10^a,则n^k=10^ak=10^(x+y),其中,a是小数且a=log10(n)。ak的整数部分x代表了n^k的位数,小数部分y决定了它的值。
则10^y*100就是前三位。
下面介绍一下fmod函数。
原型:extern float fmod(float x, float y);
功能:计算x/y的余数
说明:返回x-n*y,符号同y。
fmod还可以计算小数点后的部分,fmod(x,1.0);
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<vector>
#include<set>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=50000+5;
//快速幂取模
long long quick_mod(long long base,long long n,long long mod)
{
long long res=1;
while(n>0)
{
if(n%2!=0)
{
res=(res*base)%mod;
}
base=(base*base)%mod;
n>>=1;
}
res=res%mod;
return res;
}
int main()
{
int T;
scanf("%d",&T);
int kase=0;
while(T--)
{
printf("Case %d: ",++kase);
long long a,b;
scanf("%lld%lld",&a,&b);
printf("%d ",(int)pow(10.0,2.0+fmod(b*1.0*log10(a*1.0),1)));
printf("%03lld\n",quick_mod(a,b,1000));//补足前导0
}
}