此计划中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;
}
答案 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} }})。可能作者只是希望获得正确性的额外保证,尽管不需要。