题目
Description
对 N! 进行质因子分解。
Input
输入数据仅有一行包含一个正整数 N,N≤10000。
Output
输出数据包含若干行,每行两个正整数 p,a,中间用一个空格隔开。表示 N! 包含 a 个质因子 p,要求按 p 的值从小到大输出。
Sample 1
Inputcopy | Outputcopy |
---|---|
10 | 2 8 3 4 5 2 7 1 |
Hint
10!=3628800=(28)×(34)×(52)×710!=3628800=(28)×(34)×(52)×7。
分析
本题喊我们计算n!的质因数 (质因数,也称为素因数或质因子,是指在数论中能整除给定正整数的质数。质因数分解是将一个合数表示为若干个质数相乘的形式,这些质数就是该合数的质因数)
其实可以理解为从2到n统计这些数所有的质因数 然后再输出就好了。
所以我先用埃氏筛 筛选出1-1e4的所有质数 再求出1-n的所有数的质因数 其中用map函数映射处所有质因子的个数。
代码
#include <iostream>
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll len=1e4+10;
int n,m;
bool is_pri[len];
map<int,int>mp;
int a[len];
void get_is_pri()//埃氏筛 筛选出1-1e4的所有质数
{
memset(is_pri,1,sizeof(is_pri));
is_pri[0]=is_pri[1]=false;
for(int i=2;i<len;i++)
if(is_pri[i])
for(int j=2;i*j<len;j++)
is_pri[j*i]=false;
}
int main()
{
get_is_pri();
cin>>n;
for(int i=1;i<=n;i++)
{
int x=2;
int y=i;
while(y!=1)//再选择每个数
{
if(y%x==0&&is_pri[x])
{
mp[x]++;//使用map函数 映射出每个质因子的个数
if(mp[x]==1)
a[++m]=x;
y/=x;
x=2;
}
else
x++;
}
}
sort(a+1,a+m+1);
for(int i=1;i<=m;i++)
cout<<a[i]<<" "<<mp[a[i]]<<endl;
return 0;
}