在 codechef 和 spoj 问题中使用模 10^9+7 的意义是啥?
Posted
技术标签:
【中文标题】在 codechef 和 spoj 问题中使用模 10^9+7 的意义是啥?【英文标题】:what is the significance of modulo 10^9+7 used in codechef and spoj problems?在 codechef 和 spoj 问题中使用模 10^9+7 的意义是什么? 【发布时间】:2014-09-05 15:23:56 【问题描述】:我正在研究a problem,它需要输出为“对于每一行输出答案模 10^9+7”。为什么模 10^9+7 包含在问题中?它有什么意义?
我不是在寻找解决问题的方法;只有那个特定常数的意义。
【问题讨论】:
你是在问这个数字的值是什么(1000000007),还是模运算是如何工作的? 我在问这在问题的上下文中意味着什么。请参阅codechef.com/SEPT14/problems/CHEFLR。我不是要求解决该问题,而只是要求模10 ^ 9 + 7。 @MikeSeymour 如果你问 10^9+7 是否是与问题相关的特殊数字——我不这么认为。我认为问题设置者只是随机提出的。 好的,看到@tmyklebu 的回答后,我可以看出它不是很随机。 What's the idea of doing x mod 1000000007?的可能重复 【参考方案1】:问题要求结果模素数,因为替代方案,即要求给出“高位”的浮点结果并要求整个结果,并不总是问题设置者所寻找的。
这些问题通常是“查找并实施重复”问题。低位通常会告诉您找到的递归是否正确。 对于“高位”问题,可能有一个特殊的技巧,可能是基于巧妙的解析近似。 人们不经常询问整个结果的原因是这需要参赛者实现大数运算。 问题制造者通常不希望出于“错误的原因”使用意想不到的技巧来解决他们的问题。10^9+7 最终成为一个不错的素数选择。这是一个“安全的素数”。这意味着什么:
10^9+7 是质数。这意味着“中国剩余技巧”不适用;如果你想对两个素数的乘积取模,比如 pq,那么你可以对 p 和 q 取模,然后使用扩展的欧几里得算法将它们组合在一起。
不仅如此,10^9+6,也就是 10^9+7-1,是素数的两倍。所以乘法群以 10^9+7 为模不会分解成小东西,因此那里没有类似中文余数的技巧。
【讨论】:
旁注:如果人们在枚举问题中要求高位而不是低位,我会很高兴。找到这类问题的良好分析近似值是一门艺术,我认为它在编程竞赛中未被充分重视。【参考方案2】:在某些问题中,答案是非常很大的数字,但强迫您实现长算法并不是问题作者的目的。因此他们要求您以某个数字为模计算答案,例如1000000007
,因此您不必执行长算术,但答案仍然是可验证的。
【讨论】:
所以,这意味着我必须用 10^9+7 对输出(在这种情况下是节点上的数字)进行模数? @ShubhamMarathia 我还没有阅读具体问题,但总的来说 - 是的。 我猜这会有所帮助。非常感谢。【参考方案3】:如果要求以 10^9 为模给出答案,您可以轻松掩盖这些位,但为了使问题更棘手,选择 10^9+7 等数字
【讨论】:
以上是关于在 codechef 和 spoj 问题中使用模 10^9+7 的意义是啥?的主要内容,如果未能解决你的问题,请参考以下文章
bzoj3637 CodeChef SPOJ - QTREE6 Query on a tree VI 题解