對 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 ...