我们发现N!中质数因子p的个数,就是1~N中每个数含有的质因数p个数。
至少有一个质因子p的有
⌊
N
p
⌋
\lfloor\frac{N}{p}\rfloor
⌊pN⌋(向下取整)个,而至少有两个质因子p数的有
⌊
N
p
2
⌋
\lfloor\frac{N}{p^2}\rfloor
⌊p2N⌋个。
#include<iostream>
#include<vector>
using namespace std;
//质数筛
vector<bool> prime_func(int n) {
vector<bool> prime(n + 1, true);
for (int i = 2; i <= sqrt(n); ++i) {
if (prime[i]) {
int k = i;
while (k * i < n) {
prime[k * i] = false;
++k;
}
}
}
return prime;
}
//快速幂
int power(int a, int b) {
int ans = 1;
while (b) {
if (b & 1) {
ans *= a;
}
a *= a;
b >>= 1;
}
return ans;
}
int main()
{
int n;
cin >> n;
vector<bool> prime = prime_func(n);
for (int i = 2; i <= n; ++i) {
if (prime[i]) {
int ans = 0;
cout << i << "\t";
//统计质数出现次数
for (int k = 1; power(i, k) <= n; ++k) {
ans += n / power(i, k);
}
cout << ans << endl;
}
}
return 0;
}