【问题标题】:Modulus operator over intint 上的模运算符
【发布时间】:2014-03-22 18:55:39
【问题描述】:

是否有可能在对一个数字执行 10^9 + 7 的模数 (%) 之后,数字可能仍然超出范围。

我在 CodeChef http://www.codechef.com/problems/FIRESC 上做这个问题并且得到了一个错误的答案,在查看了作者的解决方案后,我将我的最终答案类型更改为 long long int 为 int 并得到了正确的答案。为什么会这样?

【问题讨论】:

  • 我的第一直觉是您使用的变量的宽度太小,无法进行计算。尝试无符号长长。它发生的原因是每个变量可以表示多少位。 int 只能做 ~65k 左右,而 long int 最多只能表示 ~4.5b 左右。

标签: c++


【解决方案1】:

如果您执行像result = (result * x) % MOD 这样的乘法运算,其中resultx 都可以达到MOD - 1,则中间表达式result * x 可以达到(MOD - 1) 的平方。对于模 109 + 7,这肯定不适合 32 位整数类型。因此计算不正确:基本上,您得到的不是result * x,而是模232的相同数量。

例如,从数学的角度来看,(100,001 * 100,001) 模 109 + 7 为 199,931,但以 32 位整数计算时,100,001 * 100,001 变为 1,410,265,409,并且取模 109 + 7 得到 410,265,402。

【讨论】:

    猜你喜欢
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 2015-08-18
    • 2018-10-16
    • 2016-01-03
    相关资源
    最近更新 更多