LightOJ - 1282 Leading and Trailing (数学、快速幂)

题意:求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 2147483647
using 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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章