【CH 3101】阶乘分解

题目描述

给定整数 N ( 1 N 10 6 ) ,试把阶乘 N ! 分解质因数,按照算术基本定理的形式输出分解结果中的 p i c i 即可。

算法分析

一个一个分解显然不可行,我们考虑对于每个质数,计算它在 1 × 2 × . . . × N 中每个数分解质因数后对应的指数和。

先想,至少包含一个质因子 p r i m e 的个数是多少,显然是 n p r i m e

那么,至少包含两个质因子 p r i m e 的个数是多少,显然是 n p r i m e 2

以此类推。

由于包含 x 个质因子的数中的前 x 1 个质因子已经在之前的情况中统计过,只需要累加当前结果就可以了。

对于每个质数 p ,最多循环 l o g p N 次,因此时间复杂度为 O ( n l o g 2 n )

注意避免中间结果溢出。

代码实现

#include <cstdio>
#include <cstring>
int notprime[1000005],prime[1000005],idx=0;
inline void getPrime(int n) {
    idx=0;memset(notprime,0,sizeof(notprime));
    for(int i=2;i<=n;++i) {
        if(!notprime[i]) prime[idx++]=i;
        for(int j=0;j<idx&&i*prime[j]<=n;++j) {
            notprime[i*prime[j]]=true;
            if(i%prime[j]==0) break;
        }
    }
}
int main() {
    int n;scanf("%d",&n);
    getPrime(n);
    for(int i=0;i<idx;++i) {
        int ans=0;
        for(long long int j=prime[i];j<=n;j=j*prime[i]) ans+=n/j;
        printf("%d %d\n",prime[i],ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/whz2018/article/details/81233937