gpt4 book ai didi

c++ - 即使 int 被 10^9+7 模数也会溢出

转载 作者:行者123 更新时间:2023-11-28 01:29:18 27 4
gpt4 key购买 nike

我为数字的阶乘编写了以下代码:

long int fac[max+1];
fac[0]=1;


for(int j=1;j<=max;j++)
{
fac[j]=(fac[j-1]*j)%1000000007;
}


//Printing
for(int i=0;i<T;i++)
{
cout<<fac[N[i]]<<"\n";
}

这对 long int 非常有效,但是如果我们将数组更改为 int,我们会得到错误的答案。

请告诉我为什么当 int 的范围大于 10^9+7 时会发生这种情况。

最佳答案

我们知道 0 ≤ fac[j - 1] < 109 + 7。但是 fac[j - 1] * j将比它大 j 倍,而 long 偶尔只有 32 位长 (Windows)。一个 32 位数字可以容纳的绝对最大值是 4294967295,大约只有模数的四倍。

考虑使用 unsigned long long 而不是 long int - 这应该可以工作到 j > 234

事实上,鉴于 (a * b) % Nmathematically equivalent(a % N) * (b % N)一旦您将 long int 替换为 unsigned long long 你可以重写

fac[j] = (fac[j - 1] * j) % 1000000007

fac[j] = (fac[j - 1] * (j % 1000000007)) % 1000000007

然后,因为 10000000072 < 264,你应该能够永远继续这个(尽管你最终会用完 fac,当然)。

关于c++ - 即使 int 被 10^9+7 模数也会溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52315568/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com