模块化指数2

时间:2014-12-08 21:52:44

标签: c modulus exponentiation

我已编写此代码来计算2^n mod 10^9+7。但遗憾的是,这个功能只适用于2^31,之后所有的答案都是zero。 有人可以解释一下原因吗?

typedef unsigned long long LL;
const int MOD = 1000000007;
LL powmod(int a,int n)
{
    LL p=1;
    for(;n;)
    {
        if(n%2) p=(p*a)%MOD;
        if(n/=2) a=(a*a)%MOD;
    }
    return p;
}

1 个答案:

答案 0 :(得分:0)

  

只需将LL powmod(int a,int n)更改为LL powmod(LL a,int n)

由于使用int a暗示的苛刻的ossifrage,子表达式a*aint范围内计算,并在a * a超过MAX_INT时溢出“(MM) ),与LL a一样,它在unsigned long long范围内计算。