3101 阶乘分解 (数学)

描述

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

猜你喜欢

转载自www.cnblogs.com/iwannabe/p/10693186.html