N!分解素因子及若干問題

來源:互聯網
上載者:User

將N!表示成

N! = p1^t1*p2^t2*…pi^ti…*pk^tk(其中p1,p2……pk是素數,1<N<= 10^6)

顯然很容易通過素數篩選求出pi,因為1<pi<=N,關鍵是如何快速地求出ti。

我們先來看一下對於2這個素因子,把N!分成兩部分,即奇偶兩部分

 

假設N是偶數

N!

=1*2*3*4*5……N

=(2*4*6……) * (1*3*5……)

因為有N/2個偶數,所以偶數部分可以提出N/2個2,

=2^(N/2) * (1*2*3*……N/2) * (1*3*5*……)

=2^(N/2) * (N/2)! * (1*3*5*……)

 

看到了嗎!神奇的事情發生了,N規模的問題轉化成了N/2的問題了。上面假設了N是偶數,當然N是奇數時也是一樣的,只要規定這裡的除法是取整就可以了

 

於是有遞推公式 f(n,2) = f(n/2,2) + n/2,表示n!中2的個數。

 

用同樣的方法可以推出 f(n,p) = f(n/p) + n/p,表示n!中素數p的個數。

 

於是有代碼

 

int f(int n,int p)
{
if(n==0) return 0;
return f(n/p) + n/p;
}

 

將問題推廣一下:

 

問題1:N!的末尾有幾個0?

因為 10 = 2*5,所以只要知道N!有多少個2和多少個5,問題就解決了。Min(f(n,2),f(n,5)) 顯然f(n,2)>f(n,5),所以問題就轉化成了求f(n,5)。

 

問題2:N!的轉化成12進位之後,末尾有幾個0?

和問題一樣,12=2*2*3,所以只要求Min(f(n,2)/2,f(n,3)),就可以了。

 

問題3: 求組合數C(n,m)(mod p)

C(n,m)=n!/(m!*(n-m)!) ,只要對分子和分母分別分解素因子,然後因為C(n,m)肯定是整數,所以C(n,m)肯定可以表示成p1^t1*p2^t2*......pi^ti的形式,只要拿分子素因子的冪減去分母對應的素因子的冪即可。好了,後面就簡單了,二分快速冪模數......

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.