FZU1759Super A^B mod C(快速幂取模) 公式

来源:互联网 发布:手机淘宝订单号查询 编辑:程序博客网 时间:2024/05/16 09:10

Description

Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000).

Input

There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a single space.

Output

For each testcase, output an integer, denotes the result of A^B mod C.

Sample Input

3 2 42 10 1000

Sample Output

124
对于A^B%C 有一个公式 即
A^x = A^(x % Phi(C) + Phi(C)) (mod C)
公式的具体证明:http://hi.baidu.com/aekdycoin/item/e493adc9a7c0870bad092fd9
// A^x = A^(x % Phi(C) + Phi(C)) (mod C),其中x≥Phi(C)#include <iostream>#include <cstring>#include <cstdio>using namespace std;typedef long long  LL;char bb[1000001];LL a,m;LL phi(LL n){    LL rea=n;    for(int i=2;i*i<=n;i++){        if(n%i==0){            rea=rea-rea/i;            while(n%i==0)                n/=i;        }    }    if(n>1)        rea=rea-rea/n;    return rea;}LL quick_mod(LL a,LL b,LL m){    LL ans=1;    a%=m;    while(b){        if(b&1){            ans=ans*a%m;            b--;        }        b>>=1;        a=a*a%m;    }    return ans;}int main(){    while(~scanf("%lld",&a)){        scanf("%s",bb);        scanf("%lld",&m);        LL t=phi(m);        int l=strlen(bb);        LL b=0;        for(int i=0;i<l;i++){            b=b*10+bb[i]-'0';            while(b>=t)                b-=t;        }        b+=t;        printf("%lld\n",quick_mod(a,b,m));    }    return 0;}


0 0