fzu 1752 快速幂及中间防爆long long

来源:互联网 发布:用mysql登录命令不好使 编辑:程序博客网 时间:2024/04/30 01:22

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

由于A,B较大,中间过程可能爆long long

#include <iostream>#include <stdio.h>using namespace std;long long quick(long long a,long long b,long long c){    a=a%c;    b=b%c;    long long cur=0;    while(b)    {        if(b&1)        {            cur=cur+a;            if(cur>=c) cur=cur-c;        }        a=a<<1;        if(a>=c) a=a-c;        b=b>>1;    }    return cur;}long long mod(long long a,long long b,long long c){    long long ans=1;    while(b)    {        if(b&1)        {            ans=quick(ans,a,c);            b--;        }        b/=2;        a=quick(a,a,c);       // a=a*a%c;    }    return ans;}int main(){    long long a,b,c;    while(scanf("%I64d%I64d%I64d",&a,&b,&c)!=EOF)    {        printf("%I64d\n",mod(a,b,c));    }    return 0;}


0 0