1. 程式人生 > >演算法題目中,遇到結果是大數時,為什麼喜歡 MOD 10^x+7 ?

演算法題目中,遇到結果是大數時,為什麼喜歡 MOD 10^x+7 ?

參考:https://www.zhihu.com/question/26127900/answer/49049103

模一個大數和模一個質數可以減少衝突。

比如說如果所有的結果都是偶數…你模6就只可能出現0, 2, 4這三種情況…但模5還是可以出現2, 4, 1, 3這四(4=5-1)種情況的…
hash表如果是用取模的方法也要模一個大質數來減少衝突,出題人也會這樣來 希望減少你“蒙對“的概率。

而模1e9+7又有一個很好的特點,就是相加不爆int,相乘不爆long long。



作者:李冠一
連結:https://www.zhihu.com/question/26127900/answer/32253465
在模素數p的情況下a*n(a非p的倍數)的迴圈節長為p,這是減少衝突的一個原因。另一方面模素數p的環是無零因子環,也就是說兩個非p倍數的數相乘再模p不會是零(如果是0的話,在多個數連乘的情況下會大大增加衝突概率)。還有就是模素數所成的環還是個域,因而允許“除法”操作(乘以乘法逆元),模非素數就沒有這個性質。
一般來說x的選取只要10^x+7保證比初始輸入資料的範圍大就可以了。比如有些資料範圍小的題為了避免用long long而把模數設定為10007。至於為什麼要用10^x+7,大概是因為這種patten多為素數而又比較好記吧。

作者:匿名使用者
連結:https://www.zhihu.com/question/26127900/answer/32261019