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

San*_*mar 6 c c++ algorithm math

ans = (ans + mod) % mod该计划中声明的必要性是什么?

假设mod = 10^9+7.该功能计算a到的功率b下模操作为O(log(n))的复杂性:

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;
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*etr 16

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

当使用模运算时,这种行为通常会引起问题,并且这种添加技巧mod通常用于获得数学上更正确的非负结果.一个人写道a%b,而不是简单地写,如果a可能是否定的(a%b+b)%b.

但是,它在您的问题中的代码中的使用是奇怪的.在这种情况下,从主代码调用函数之前更容易假设a为正(例如,通过进行主调用).可能作者只是想获得正确性的额外保证,尽管不需要.powerpower((a%mod+mod)%mod, b)

  • 函数调用的这个语句幂((%mod + mod)%mod,b))非常适合避免在递归的每个步骤中计算它.谢谢.. (3认同)