(num + mod)%mod语句的需要是什么?

时间:2015-07-08 10:27:40

标签: c++ c algorithm math

此计划中ans = (ans + mod) % mod声明的需要是什么?

假设mod = 10^9+7。此函数在O(log(n))复杂度的mod操作下计算a b的幂:

long long power(long long a, long long b)
{
    if (b == 0) 
        return 1ll;
    long long ans = power(a, b/2);
    ans = (ans * ans) % mod;
    ans = (ans + mod) % mod;
    if(b % 2 == 1)
        ans = (ans * a) % mod;
    ans = (ans + mod) % mod;
    return ans;
}

1 个答案:

答案 0 :(得分:16)

这种结构的最常见用法是确保结果是非负的。对于正面和负面参数,标准operator%的行为有所不同:例如,4%3==1,但是(-2)%3==-2,而您可能期望(-2)%3==1(-2)/3==-1,这是数学上的更正确。

当使用模运算时,这种行为通常会导致问题,并且通常采用添加mod的技巧来获得数学上更正确的非负结果。如果a%b可能是否定的,则不是简单地写a,而是写(a%b+b)%b

但是,它在你问题的代码中的用法很奇怪。在这种情况下,在从主代码调用a函数之前,更容易假设power为正(例如,通过使主调用{{1} }})。可能作者只是希望获得正确性的额外保证,尽管不需要。