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    }}
原创粉丝点击