给定整数N,将阶乘N!分解质因数,按照算数基本定理的形式输出分解结果中的pi和ci即可,即幂指形式
N ∈ [1,1e6]
# 题解
将1~N中的数都分解质因数,再把结果合并,时间复杂度是O(N√N)
1~N中每个数的质因子都不会超过N,可以预处理1~N中的质数,
转化为判断N!中包含多少。N!中质因子的个数等于1~N每个数包含质因子p的个数之和
在1~N中,p的倍数,即至少包含1个质因子p的个数是N/p下取整,至少包含两个的为
N/p2下取整,其中指数在N/p2中已经被计算过一次,所以只需要算一次
以此类推直到 N/plogpN,其中的log也是下取整,对于每个质数p
花费O(log N)的时间计算,所以总共的时间复杂度是O(NlogN)
其中log 的底数分别为质数,大于等于2所以实际小于O(NlogN)
1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const int N=1e6+10; 5 int p[N],cnt; 6 bool st[N]; 7 int n; 8 void get_primes(int n){ 9 for(int i=2;i<=n;i++){ 10 if(!st[i]) p[cnt++]=i; 11 for(int j=0;p[j]<=n/i;j++){ 12 st[p[j]*i]=true; 13 if(i%p[j]==0) break; 14 } 15 } 16 } 17 int main(){ 18 scanf("%lld",&n); 19 get_primes(n); 20 for(int i=0;i<cnt;i++){ 21 int sum=0; 22 int a=p[i]; 23 for(int j=n;j;j/=a){ 24 sum+=j/a; 25 } 26 cout<<a<<' '<<sum<<endl; 27 } 28 }