CH3101 阶乘分解

题目链接

分解\(n!\)的质因数,输出相应的\(p_i\)\(c_i\)
其中\(1\leq n\leq 10^6\)

 
考虑每一个质因子 \(p\)\(n!\) 中出现的次数。显然,\(1\)~\(n\) 中包含 \(p\) 的个数为 \(\lfloor\frac{n}{p}\rfloor\),包含 \(p^2\) 的个数为 \(\lfloor\frac{n}{p^2}\rfloor\)...最后累加起来就行了。复杂度\(O(nlogn)\)
代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 5;
ll n;
ll vis[N],p[N],c[N];
ll cnt ;
int main(){
    ios::sync_with_stdio(false);cin.tie(0);
    cin>>n;
    for(ll i=2;i<=n;i++){
        if(!vis[i]){
            ll num = 0;
            for(ll j=i;j<=n;j*=i) num+=n/j;
            p[++cnt]=i;c[cnt]=num;
            for(ll j=i*i;j<=n;j+=i) vis[j]=1;
        }
    }
    for(int i=1;i<=cnt;i++) cout<<p[i]<<" "<<c[i]<<'\n';
    return 0 ;
}
posted @ 2019-04-20 22:29  heyuhhh  阅读(185)  评论(0编辑  收藏  举报