描述
给定整数 N(1≤N≤10^6),试把阶乘 N! 分解质因数,按照算术基本定理的形式输出分解结果中的 p_i 和 c_i 即可。
输入格式
一个整数N。
输出格式
N! 分解质因数后的结果,共若干行,每行一对pi, ci,表示含有pi^ci项。按照pi从小到大的顺序输出。
样例输入
5
样例输出
2 3 3 1 5 1
样例解释
5! = 120 = 2^3 * 3 * 5
思路: 对于一个素数在n!里的个数 == n/p + n/p²+ ... n/plogpn (对于n/p²,本来应该乘上2,但是由于有p之前n/p的时候计算了一次,三次方也类似)
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int n; 5 const int maxn = 1e6+5; 6 int prime[maxn]; 7 int pi[maxn]; 8 int ci[maxn]; 9 int tot; 10 void get_pri(int n) 11 { 12 bool vis[n+5]; 13 tot = 0; 14 memset(vis,0,sizeof(vis)); 15 for(int i=2;i<=n;i++) 16 { 17 if(!vis[i])prime[++tot] = i; 18 for(int j=i;j<=n/i;j++) 19 { 20 vis[i*j] = 1; 21 } 22 } 23 } 24 25 int main() 26 { 27 get_pri(maxn); 28 scanf("%d",&n); 29 int i; 30 for(i=1;i<=tot;i++) 31 { 32 if(prime[i] <= n) 33 { 34 int lim = log(n)/log(prime[i]); 35 int t = 1; 36 pi[i] = prime[i]; 37 for(int j=1;j<=lim;j++) 38 { 39 t *= prime[i]; 40 ci[i] += n/t; 41 } 42 } 43 else break; 44 } 45 for(int j=1;j<i;j++) 46 { 47 printf("%d %d\n",pi[j],ci[j]); 48 } 49 }