一、题目
二、解法
需要逐步分析:
假设 a , b a,b a,b是两个都在序列中的两个数:
1. 1. 1.若 a m o d b = 0 a\mod b=0 amodb=0,如果非要删数的话,删 a a a更优
2. 2. 2.若 a a a被选了进去,则 a a a的约数也被选了进去(如果 a a a的约束没被选,还不如删 a a a选它呢!)
看我们能不能用上面的性质搞点事情,如果一个数被选了进去那么可能产生的答案是它最大的因数,我们可以把最有数算出它的最大因数排序,然后按顺序选他们即可,当前的答案一定是那个最大因数。
#include <cstdio>
#include <algorithm>
using namespace std;
const int M = 500005;
int read()
{
int x=0,f=1;char c;
while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
return x*f;
}
int n,a[M];
signed main()
{
n=read();
for(int i=1;i<=n;i++)
for(int j=i+i;j<=n;j+=i)
a[j]=i;
sort(a+1,a+1+n);
for(int i=2;i<=n;i++) printf("%d ",a[i]);
}