階乘的素因子分解 51nod 1189

2021-07-04 06:36:01 字數 754 閱讀 2755

對 n! 進行素因子分解:

n! = 1*2*3*4*…*n,因此它一定含有小於等於n 的所有素數我們要對這些素數分別進行處理求出含有多少項。

例如我們求n!含有多少個素因子p

設f[n][p] 表示n!含有多少素因子p;

1*2*3*4*,,,,,*n = ( p*2p*3p*4p*,,,,*(n/p*p) ) * k   其中k不含有素因子p;

(注: n/p*p  =  (int)(n/p) * p)

這裡把 n 以內的所有 p 的倍數拿出來,剩下的數組成 k ,很明顯 k 裡面不含有素因子p 

1*2*3*4*…*n = p^(n/p) * (n/p)!  * k ;  

已知 k 裡面不含有 素因子 p ,那麼此時只需要求 (n/p)! 包含的素因子 p 個數,這裡又回到了母問題 ,所以用遞迴解決。

則有遞迴方程:f[n][p] = n/p + f[n/p][p] 

51nod 1189 :

#include#includeusing namespace std;

const long long mod = 2e9+14;//最後ans要除以2 ,所以這裡 mod 取 1e9+7 的2倍

bool isprime[1000005];

int prime[100000],tot = 0,temp,n;

long long num;

long long getnum(int n,int p){ //用int可能會超出範圍

if(n

n 素因子分解中素數p的冪

n 素因子分解中素數p的冪為 n p n p 2 n p 3 nefu 118 傳送門 從輸入中讀取乙個數n,求出n!中末尾0的個數。輸入有若干行。第一行上有乙個整數m,指明接下來的數字的個數。然後是m行,每一行包含乙個確定的正整數n,1 n 1000000000。對輸入行中的每乙個資料n,輸出一行...

數論 素數篩選法與整數的素因子分解

篩選法 求出n以內的素數,最快的應該是篩選法。篩選法的思路是 要求10000以內的素數,把1 10000都列出來,1不是素數,劃掉 2是素數,所有2的倍數都不是素數,劃掉 取出下乙個倖存的數,劃掉它的所有倍數 直到所有素數找完為止。這種做法的空間複雜度是o n 時間複雜度o n logn const...

51Nod 1224 階乘的冪的倍數

題解 注意到 f i,k 一定單調,從小到大列舉每乙個 i 分解素數可以求出此時滿足條件的最小的 n 看 把 不會證明複雜度 n 乘若干個 log hhhhhhhh include include using namespace std typedef long long ll const int ...