阶乘质因数分解

# 题意

给定整数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 }

猜你喜欢

转载自www.cnblogs.com/hhyx/p/12602552.html