f(x)表示x分解的质因数的个数,求1-n中最大的f(X) (1<=x<=n)。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#define maxn 2000000
using namespace std;
int cnt[maxn+5],ans[maxn+5];
vector<int> prime;
bool vis[maxn+5];
void init()
{
memset(vis,0,sizeof(vis));
for(int i=2;i<=maxn;i++)
{
if(!vis[i])
{
prime.push_back(i);
cnt[i]=1; //cnt[i]存i的质因数的个数
}
for(int j=0;j<prime.size() && i*prime[j]<=maxn;j++)
{
vis[i*prime[j]]=true;
cnt[i*prime[j]]=cnt[i]+1; //边筛素数边计算cnt数组
if(i%prime[j]==0) break;
}
}
}
int main()
{
int n;
init();
ans[1]=cnt[1];
for(int i=2;i<=maxn;i++)
{
ans[i]=max(ans[i-1],cnt[i]); //ans[i]记录1-i中最大的f(x)
}
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",ans[n]);
}
return 0;
}