#include<cstdio>
#include<cmath>
#include<iostream>
#include<map>
#include<cstring>
using namespace std;
#define endl "\n"
#define ll long long
const int N = 1e6 + 7;
int prime[N];
bool isprime[N];
int cnt = 1;
//欧拉筛模板
void init() {
memset(isprime, true, sizeof isprime);
isprime[1] = false;
for (int i = 2; i <= 1e6 + 7; i++) {
if (isprime[i]) prime[cnt++] = i;
for (int j = 1; j < cnt && prime[j]*i <= N; j++) {
isprime[prime[j]*i] = false;
if (i % prime[j] == 0)
break;
}
}
}
int calc(int n, int p) {
int s = 0;
//每次计算,比如p==2,就是计算2,4,8,16......
//第一次进入把2,4,8,16....里的2记了一便
//第二次进入把4,8,16....里的2记了一便
//第三次进入把8,16....里的2记了一便
//以此类推
while (n) {
s += n / p;
n /= p;
}
return s;
}
signed main() {
int n;
cin >> n;
init();
for (int i = 1; i < cnt; i++) {
int p = prime[i], ans = 0;
//cout << p << endl;
ans = calc(n, p);//计算每个质数里出现的次数
if (ans)
cout << p << " " << ans << endl;
}
return 0;
}
阶乘分解(欧拉筛)
最新推荐文章于 2024-06-25 21:10:30 发布