【问题标题】:MOD 1000000007 seems to be incorrectMOD 1000000007 似乎不正确
【发布时间】: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 完成了这项工作,但我想只使用像 intlong long 这样的内置数据类型。
  • @Yksisarvinen 好吧,你能告诉我如何正确实现该功能吗?

标签: c++ mod


【解决方案1】:

模组中的“除法”与普通除法有很大不同,所以在C/C++中不能只使用/%;你需要一个算法来找到乘法逆。见https://cs.stackexchange.com/questions/10552/division-modulo-a-prime-in-modular-arithmetic

【讨论】:

  • 恐怕我听不懂。为什么/%不能在同一个表达式中使用?
  • 因为/ 进行整数除法而不是模除法。要获得适用于模块化组的答案,您需要模块化划分。
  • @Yksisarvinen:因为 3 模 7 的乘法逆元是 5(将 3 乘以 5 得到的数字是 1,模 7),但 3/5 产生零,这是错误的。要计算这种乘法逆运算,您需要使用不同的算法,例如Extended Euclidean Algorithm
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 2012-06-09
  • 2014-07-16
  • 2023-01-08
  • 2017-04-20
  • 2015-12-02
  • 2012-01-04
相关资源
最近更新 更多