阶乘分解
先筛出1~N的每个质数p,然后考虑阶乘N!中一共包含多少个质因子p
对于每个p只需要用O(logN)的时间计算上述和式,总时间复杂度为O(NlogN)
#include <bits/stdc++.h>
using namespace std;
int v[1000005];
vector<int> su;
int main()
{
int n;
cin >> n;
for (int i = 2; i <= n; i++)//埃氏筛法
{
if (v[i])
continue;
su.push_back(i);
for (int j = i; j <= n / i; j++)
v[i * j] = i;
}
for (int i = 0; i < su.size(); i++)//加和运算
{
int sum = 0;
int p = su[i];
for (int j = 1; j <= floor(log(n) / log(su[i])); j++)
{
sum += floor(n / p);
p *= su[i];
}
cout << su[i] << ' ' << sum << '\n';
}
return 0;
}