#include<iostream>
#include<cstdio>
#define M 1000000007
using namespace std;
long long int power(int a,int b)
{
if(b==0)
return 1;
else if(b==1)
return a;
else if(b%2==0)
return power((a*a)%M,b/2);
else
return (power((a*a)%M,b/2)*a)%M;
}
在这个函数中,当我传递a = 2,b> 31时,它总是返回0.对于b = 31我得到147483634。你能告诉问题在哪里吗?
或者你能告诉另一种计算数字大功率的方法。
答案 0 :(得分:1)
在(a*a)%M
中,a * a可能在计算余数之前溢出。从2开始,溢出产生0并不让我感到惊讶。您需要使用能够表示(M-1)*(M-1)的类型,即1000000012000000036,而int
通常限于2147483647. long long
(自99以来C中的标准和C ++ 11,其他地方的共同扩展保证可以工作。
答案 1 :(得分:0)
在<cmath>
下pow(x,y)
,其中x是基数,y是指数。 X ^年。
答案 2 :(得分:0)
当a
为int
时,a*a
使用int
大小的算术。请尝试使用a*(long long)a
,以使用不会溢出的更宽的算法。