C++ 国防部100000007似乎是不正确的

C++ 国防部100000007似乎是不正确的,c++,mod,C++,Mod,我有一个简单的问题,如何让这个函数返回mod 100000007值?我试图实现((k+n)*n/k+n)%MOD,同时避免中间溢出 long-long函数(long-long n,int-k){ 返回((k+n)*n)/k+n; } 根据这三个公式:(a+b)%c=((a%c)+(b%c))%c和(a-b)%c=((a%c)-(b%c))%c和(a*b)%c=((a%c)*(b%c))%c,我写了这封信: long-long函数(long-long n,int-k){ 返回((((k%MOD)

我有一个简单的问题,如何让这个函数返回mod 100000007值?我试图实现
((k+n)*n/k+n)%MOD
,同时避免中间溢出

long-long函数(long-long n,int-k){
返回((k+n)*n)/k+n;
}
根据这三个公式:
(a+b)%c=((a%c)+(b%c))%c
(a-b)%c=((a%c)-(b%c))%c
(a*b)%c=((a%c)*(b%c))%c
,我写了这封信:

long-long函数(long-long n,int-k){
返回((((k%MOD)+(n%MOD))%MOD)*(n%MOD))/k)%MOD+(n%MOD));
}

这似乎是不正确的。

模组中的“除法”与普通除法非常不同,因此不能在C/C++中仅使用
/
%
;你需要一个算法来找到乘法逆。请参见

100000007大于32位。这可能会使两个>32位的值相乘,这需要64(或63)位以上的位来表示。您的乘法运算溢出。请使用或类似的方法。我不明白根据评论和答案,为什么它不起作用<代码>100000007完全适合32位,通常用于需要大量计算的编程任务。因为它可以容纳32位,所以它的正方形可以容纳64位,而
long-long
必须足以容纳它。我使用boost库中的
cpp_int
完成了这项工作,但我只想使用
int
long
之类的内置数据类型。@Yksisarvinen,你能告诉我怎样才能正确地实现这个功能吗?恐怕我不明白。为什么在同一个表达式中使用
/
%
不合适?因为
/
不是模除而是整数除。要得到适用于模组的答案,您需要一个模除。@Yksisarvinen:因为3模7的乘法逆是5(3乘以5得到的数字是1,模7),但是
3/5
产生零,这是错误的。要计算这类乘法逆,需要使用不同的算法,例如。