(num+mod)%mod的语句需要啥?
Posted
技术标签:
【中文标题】(num+mod)%mod的语句需要啥?【英文标题】:What is the need of the statement of (num+mod)%mod?(num+mod)%mod的语句需要什么? 【发布时间】:2015-07-08 10:27:40 【问题描述】:这个程序中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】:这种结构最常见的用法是确保结果为非负数。标准的 operator%
对正和负参数的行为不同:例如,4%3==1
,但 (-2)%3==-2
,而您可能期望 (-2)%3==1
和 (-2)/3==-1
,这在数学上更正确。
当使用模运算时,这种行为通常会导致问题,并且经常使用添加mod
的技巧来获得数学上更正确的非负结果。如果a
可以为负数,则不要简单地写a%b
,而是写(a%b+b)%b
。
但是,它在您问题的代码中的用法很奇怪。在这种情况下,更容易假设a
是肯定的之前 从主代码调用power
函数(例如,通过像power((a%mod+mod)%mod, b)
这样的主调用)。可能作者只是想获得额外的正确性保证,尽管这不是必需的。
【讨论】:
这个函数调用的语句power((a%mod+mod)%mod, b))对于避免在递归的每一步计算它确实很好。谢谢..以上是关于(num+mod)%mod的语句需要啥?的主要内容,如果未能解决你的问题,请参考以下文章
sql语句mod(ascii(substr(userid,-1,1)),6)=4怎么解释
解决WorkBench执行更新语句时1175 SQLSTATE: HY000 (ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE)
解决WorkBench执行更新语句时1175 SQLSTATE: HY000 (ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE)
解决WorkBench执行更新语句时1175 SQLSTATE: HY000 (ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE)