我的代码的幂函数存在一些错误,它为小值返回正确的答案但是对大值给出了错误的答案。
#include<stdio.h>
long long MOD= 1000000007;
long long power(long long i,long long j)
{
if(j==0)
return 1;
long long d;
d=power(i,j/(long long)2);
if(j%2==0)
return (d*d)%MOD;
else
return (d*d*i)%MOD;
}
int main()
{
long long inv=1;
inv=power(25,MOD-2)%MOD;
printf("%lld\n",inv);
}
答案 0 :(得分:1)
您的算法溢出了C实现中long long
中可表示的值。
此外,您正在处理挑战问题或家庭作业,已经在Stack Overflow上多次讨论过,您可以通过搜索“1000000007”看到。
答案 1 :(得分:0)
您需要小心使用(d*d*i)%MOD;
,因为没有模数的多个操作不正确, 需要精确度和帐户溢出风险 。要严格纠正,你需要写
return ((d*d)%MOD * i)%MOD;
即使在这种情况下我也假设i == i%MOD
log2((MOD-1)x(MOD-1)x25) = log2(1000000006x1000000006x25) = 64.438
这意味着您在使用此输入进行计算时会溢出。
答案 2 :(得分:0)
有符号长long的范围是-2 ^ 63到(2 ^ 63-1),最后一位用于存储符号。在你的情况下,当评估大数的乘法时,结果会溢出,第64位的数字(存储符号)将得到值1(这意味着-ve值)。
这就是你得到负值作为输出的原因。