问题 A: 阶乘分解
时间限制: 1 Sec 内存限制: 128 MB
题目描述
给定整数N(1≤N≤10^6),试把阶乘N!分解质因数,按照算术基本定理的形式输出分解结果中的pi和ci即可。
输入
一个整数N。
输出
N! 分解质因数后的结果,共若干行,每行一对pi, ci,表示含有pi^ci项。按照pi从小到大的顺序输出。
样例输入
复制样例数据
5
样例输出
2 3 3 1 5 1
提示
5! = 120 = 2^3 * 3 * 5
筛素数,求<=N的所有素数出现的个数
/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>
typedef long long LL;
using namespace std;
int prim[80005], vis[1000005], n, tot;
void get_prim(int x){
for (int i = 2; i <= x; i++){
if(!vis[i]) prim[tot++] = i;
for (int j = 0; j < tot && prim[j] * i <= x; j++){
vis[prim[j] * i] = 1;
if(i % prim[j] == 0) break;
}
}
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
scanf("%d", &n);
get_prim(n);
for (int i = 0; i < tot; i++){
LL t = prim[i]; //注意t可能超过int型
LL ans = 0;// 同上
while(t <= (LL)n){
ans += n / t;
t *= prim[i];
}
printf("%d %lld\n", prim[i], ans);
}
return 0;
}
/**/