繁体   English   中英

MOD 1000000007 似乎不正确

[英]MOD 1000000007 seems to be incorrect

我有一个简单的问题,我怎样才能让这个 function 返回 mod 1000000007 值? 我试图在避免中间溢出的同时实现((k+n)*n/k+n)%MOD

long long func(long long n,int k){
    return ((k+n)*n)/k+n;
}

根据这3个公式: (a+b)%c=((a%c)+(b%c))%c(ab)%c=((a%c)-(b%c))%c(a*b)%c=((a%c)*(b%c))%c ,我这样写:

long long func(long long n,int k){
    return (((((((k%MOD)+(n%MOD))%MOD)*(n%MOD)))/k)%MOD+(n%MOD));
}

这似乎是不正确的。

模组中的“除法”与普通除法非常不同,因此在 C/C++ 中不能只使用/% 你需要一个算法来找到乘法逆。 请参阅https://cs.stackexchange.com/questions/10552/division-modulo-a-prime-in-modular-arithmetic

你没有做错什么,10^9+7 只是一个非常大的数字,它使常规的 C++ 模数中断。 如果你真的需要它,你将不得不自己实现一个算法来计算这些大数字的模数。 我发现了这篇关于它的文章: https://www.geeksforgeeks.org/modulo-1097-1000000007/

我不确定这是否是您的代码的唯一问题,但您肯定在整个表达式中缺少%MOD

(((((((k%MOD)+(n%MOD))%MOD)*(n%MOD)))/k)%MOD+(n%MOD))%MOD;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

它应该来自这个添加:

((k+n)*n)/k + n
~~~~~~~~~~~~^

您从两个操作数( ((k+n)*n)/kn )中取模,但您没有从加法结果中取模,可能大于1000000007

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM