我已编写此代码来计算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;
}
答案 0 :(得分:0)
只需将
LL powmod(int a,int n)
更改为LL powmod(LL a,int n)
。
由于使用int a
暗示的苛刻的ossifrage,子表达式a*a
在int
范围内计算,并在a * a
超过MAX_INT
时溢出“(MM) ),与LL a
一样,它在unsigned long long
范围内计算。