LightOJ

来源:互联网 发布:嵌入式就业前景 知乎 编辑:程序博客网 时间:2024/06/05 16:37

题意:求n^k的前三位和后三位数字。


思路:n=10^a,a为浮点数,则n^k=10^(a*k)=10^(x+y),x为整数,y为小数,则n^k前三位数字则为10^y*100的整数部分,a可取log得出,y可由fomd()函数得。n^k的后三位则可有快速幂算出,模数为1000,注意补足前导0。


#include <iostream>#include <iomanip>#include <algorithm>#include <cstdio>#include <cstring>#include <queue>#include <string>#include <cmath>#include <vector>#include <utility>#include <set>#include <climits>//#pragma comment(linker, "/STACK:1024000000,1024000000")#define INF 2147483647using namespace std;typedef long long ll;ll mod_pow(ll x,ll n,ll mod)//快速幂求后三位{    ll res=1;    while(n>0)    {        if(n&1)            res=res*x%mod;        x=x*x%mod;        n>>=1;    }    return res;}int t,i,j;int main(){    scanf("%d",&t);    for(i=1;i<=t;i++)    {        ll num;        int k;        scanf("%lld%d",&num,&k);        int nn=pow(10.0,2.0+fmod(log10(num)*k,1.0));//n^k的前三位        int nn2=mod_pow(num,k,1000);        printf("Case %d: %d %03d\n",i,nn,nn2);    }    return 0;}


原创粉丝点击