AcWing 197阶乘分解

题目描述:
给定整数 N ,试把阶乘 N! 分解质因数,按照算术基本定理的形式输出分解结果中的 pi 和 ci 即可。
题解:
首先这个题目肯定需要做一个筛子,但是N!的值实在太大,所以直接计算阶乘后打表肯定不现实。
但是我们注意道,对于N!,一个质因子p的个数取决于1~N这N个数中有多少个质因子p,最后对于p的答案只需要相加即可
那么问题就变成了:如何求1~N中的p的个数?
我们知道,在1~N中,p的倍数有,N/p个,但是我们注意到,这N个数中可能有p的平方的倍数、p的三次方的倍数…所以我们需要在此基础上加上N / p ^ 2 + N / p ^ 3+ …注意p ^ k <= n.这就算出了N!中的所有质因子p的个数了!
AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<utility>
using namespace std;
const int maxn = 1e6;
int v[maxn],p[maxn],cnt = 0;
int ans[maxn] = {0};
void get_prime(int n)
{
    memset(v,0,sizeof(v));
    for(int i = 2;i <= n;i++){
        if(v[i]) continue;
        p[++cnt] = i;
        for(int j = i;j <= n/i;j++) v[i * j] = 1; 
    }
    return ;
}
int main()
{
    int n;
    cin >> n;
    get_prime(n);
    for(int i = 1;i <= cnt;i++){
        int j = 1;
        while(pow(p[i],j) <= n){
            ans[p[i]] += n / pow(p[i],j);
            j++;
        }
    }
    for(int i = 1;i <= maxn;i++){
        if(ans[i]) cout << i << ' ' << ans[i] << endl;
    }
    return 0;
}
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页