B
来源:互联网 发布:蚁群算法代码旅行问题 编辑:程序博客网 时间:2024/04/30 10:20
题意:
给出两个数,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 0x3f3f3f3fusing 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 }}