1. 程式人生 > >階乘分解 contest 數論基礎——質數 T4

階乘分解 contest 數論基礎——質數 T4

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;
}