是否有一個有效的算法來計算最小的整數N,使得N!可以被p^k整除,其中p是一個相對小的素數,k是一個非常大的整數。換句話說,找到最小的N使得N!可以被一個素數整除
factorial(N) mod p^k == 0
如果給定的n和p,我想求P多少次劃分成N個!我會使用衆所周知的公式
k = Sum(floor(N/p^i) for i=1,2,...
我已經做了蠻力搜索k值很小,但隨着k的增加,這種方法很快就會崩潰,而且似乎沒有一種模式可以推斷出較大的值。由五元美鈔和哈馬提出
編輯的2011年6月13日
使用的建議,我用了一個半二進制搜索來解決這個問題,但以這樣的方式不太他們建議。使用上面第二個公式的截斷版本,我計算了N的上界作爲k和p的乘積(僅使用第一項)。我用1作爲下界。使用經典的二分搜索算法,我計算了這兩個值之間的中點,並計算了第二個公式中將使用此中點值作爲N的k值,這次是使用所有項。
如果計算的k太小,我調整了下限並重復。太大了,我首先測試看中間點1計算的k是否小於所需的k。如果是這樣,中點返回爲最接近的N.否則,我調整了高點並重復。
如果計算出的k相等,我測試了中點-1的值是否等於中點的值。如果是這樣,我將高點調整爲中點並重復。如果中點-1小於期望的k,則中點返回爲期望的答案。
即使k值非常大(10位或更多位),該方法也可以運行O(n log(n))速度。
即使尼莫的答案不是很清楚,我相信它比二分查找更好。畢竟,它是O(1)!或者,更確切地說,因爲你必須處理數字,所以它是O(log k)。這個問題是可以直接解決的,所以不需要做一些迭代計算。 – Fezvez 2011-06-13 17:51:42
最好將自己的問題回答回答,而不是對問題的編輯。 – ThomasMcLeod 2011-06-13 18:53:10
「10位或更多位」不是「非常大」:-)。我編輯了我的答案來添加一個Perl實現。即使對於數十位數字的k,似乎也能正常工作,但我不知道答案是否正確。如果你能找到一個能夠給出錯誤答案的案例,我希望看到它。 – Nemo 2011-06-13 23:47:03