- 阶乘分解
给定整数 N ,试把阶乘 N! 分解质因数,按照算术基本定理的形式输出分解结果中的 pi 和 ci 即可。
输入格式
一个整数N。
输出格式
N! 分解质因数后的结果,共若干行,每行一对pi,ci,表示含有pcii项。按照pi从小到大的顺序输出。
数据范围
1≤N≤106
输入样例:
5
输出样例:
2 3
3 1
5 1
样例解释
5!=120=23∗3∗5
思路:最大质因数肯定不超过n,线性筛求1~n的素数
例如:5的阶乘,找2的次方数,那么我们先用5/2 得 2个,那就是说2的倍数的数有2个 ,分别是 2和4,然后我们再5 / (2*2) 得1,那就是说4的倍数有1个,就是4。
4被统计了两次,2被统计了一次,所以2的次方数是3。
#include <bits/stdc++.h>
#define ll long long
#define inf 1<<30
using namespace std;
const int N=1e6+5;
int n,vis[N],prime[N],cnt=0;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
for(int i=2;i<=1e6;i++)//线性打素数表
{
if(!vis[i])
prime[cnt++]=i;
for(int j=0;j<cnt&&i*prime[j]<=1e6;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
cin >> n;
for(int i=0;i<cnt;i++)
{
int res=0;
for(ll j=prime[i];j<=n;j*=prime[i])
res+=n/j;
if(res)
printf("%d %d\n",prime[i],res);
}
return 0;
}
另一种:
#include <bits/stdc++.h>
#define ll long long
#define inf 1<<30
using namespace std;
const int N=1e6+5;
int n,vis[N],prime[N],cnt=0;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
for(int i=2;i<=1e6;i++)//线性打素数表
{
if(!vis[i])
prime[cnt++]=i;
for(int j=0;j<cnt&&i*prime[j]<=1e6;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
cin >> n;
for(int i=0;i<cnt;i++)
{
int res=0,t=n;
while(t)
res+=t/prime[i],t/=prime[i];
if(res)
printf("%d %d\n",prime[i],res);
}
return 0;
}