【发布时间】:2019-11-05 20:53:53
【问题描述】:
我有一个简单的问题,我怎样才能让这个函数返回 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和(a-b)%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));
}
这似乎是不正确的。
【问题讨论】:
-
1000000007 超过 32 位。这可能会乘以两个 >32 位的值,这需要超过 64(或 63)位来表示。你的乘法溢出了。
-
使用GMP 或类似的。
-
我不明白为什么它不应该根据评论者和答案工作。
1000000007非常适合 32 位,通常用于需要大量计算的编程任务。因为它适合 32 位,所以它的正方形将适合 64 位,long long必须足以容纳它。 -
我已经使用 boost 库中的
cpp_int完成了这项工作,但我想只使用像int和long long这样的内置数据类型。 -
@Yksisarvinen 好吧,你能告诉我如何正确实现该功能吗?