2014-12-08 3 views
1

이 코드를 작성하여 2^n mod 10^9+7을 계산했습니다. 하지만 안타깝게도이 기능은 2^31까지만 작동하며 이후 모든 대답은 zero입니다. 누군가가 왜 어떤 빛을 비출 수 있습니까?2의 모듈러 지수가

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; 
} 
+2

'a'가 'MAX_INT'를 (를) 초과하면 어떻게됩니까? –

+2

'LL powmod (int a, int n)'을'LL powmod (LL a, int n)'로 변경하십시오. –

+0

동의어, 귀하의 이름이 일치하지 않습니다. 'typedef unsigned long long ULL;과'typedef long long LL;'이 더 좋을 것입니다. – glglgl

답변

0

그냥 LL powmod(LL a,int n)LL powmod(int a,int n)을 변경합니다. LL a으로는 unsigned long long 범위에서 연산 동안

로서 비위 ossifrage가 int a으로 암시 상기 표현식 a*aint 범위 계산 a * aMAX_INT " (M.M)를 초과 할 때 " 오버플로된다.