階乘分解 contest 數論基礎——質數 T4
阿新 • • 發佈:2018-12-23
Description
給定一個整數N,把N!分解質因子,N!=∑pi^ci 其中(pi為質數,且p1<p2<p3...)。
Input
一個整數N。
Output
輸出質因數 次數
Hint
1<=N<=10^6
Solution
N!中質因子的個數就等於1~N每個數包含質因子p的個數之和。在1~N中,至少包含一個p的有N/p個,而包含兩個p的有N/p^2個。但其中一個質因子的已經在N/p裡面加過了,所以只需要在統計第二個因子,就是加N/p^2而不*2。
對於每個p時間複雜度是O(logN),總的時間複雜度是O(NlogN)。特別要注意的是,程式碼中comm需要long long,否則溢位後成了負數會死迴圈。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #define maxn 1000005 #define inf 0x3f3f3f3f using namespace std; int primes[maxn],num[maxn],ans[maxn]; int cnt,n; inline void OULA(){ for(int i=2;i<=maxn;i++){ if(!num[i])primes[++cnt]=i; for(int j=1;i*primes[j]<=maxn;j++){ num[i*primes[j]]=true; if(i%primes[j]==0)break; } } } inline void workk(){ for(int i=1;primes[i]<=n;i++){ int val=0,j=1; long long comm=0; while(true){ comm=pow(primes[i],j); if(comm>n)break; val+=n/comm; j++; } ans[i]=val; } } int main(){ scanf("%d",&n); OULA(); workk(); for(int i=1;primes[i]<=n;i++){ if(ans[i]!=0){ printf("%d %d\n",primes[i],ans[i]); } } return 0; }