只需要使得最终答案等于一就好了
那么剩下的就是如何去删去所有的质数了
贪心
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
#include<queue>
using namespace std;
priority_queue<int >Q;
set<int>S;
const
int maxn=60000;
int prime[maxn+1],tot;
bool check[maxn+1];
bool use[maxn+1];
void Debug()
{
set<int>::iterator A;
for(A=S.begin();A!=S.end();A++)
cout<<*A<<" ";
puts("");
}
int main()
{
int n;
scanf("%d",&n);
for(int i=2;i<=n;i++)
{
if(!check[i])Q.push(prime[++tot]=i),S.insert(i);
int k,j;
for(k=prime[j=1]*i;k<=n;k=prime[++j]*i)
{
check[k]=true;
if(i%prime[j]==0)break;
}
}
int ans=0;
S.insert(-1);
while(S.size()!=1)
{
set<int>::iterator A;
A=S.end();
A--;
int t=*A;
A=S.upper_bound(n/t);
A--;
int N=*A;
if(N==-1)
{
// printf("***Pop:%d\n",t);
S.erase(t);ans++;continue;
}
if(N==t)N=*--A;
if(N==-1)
{
// printf("***Pop:%d\n",t);
S.erase(t);ans++;continue;
}
if(N*t>n)N=*--A;
if(N==-1)
{
// printf("***Pop:%d\n",t);
S.erase(t);ans++;continue;
}
// Debug();
S.erase(t);
// printf("***del:%d\n",t);
S.erase(N);
// printf("***del:%d\n",N);
S.insert(t*N);
// printf("***add:%d\n",t*N);
}
cout<<ans<<endl;
return 0;
}