【CH 3101】阶乘分解

题目描述

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

算法分析

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

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

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

以此类推。

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

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

注意避免中间结果溢出。

代码实现

#include 
#include 
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;jtrue;
            if(i%prime[j]==0) break;
        }
    }
}
int main() {
    int n;scanf("%d",&n);
    getPrime(n);
    for(int i=0;iint 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;
}

你可能感兴趣的:(题解)