【题解】
题意:给定一个n,要求构造一个序列,下标从2-n,且对于任意i与j互质的(i,j)对,满足ai≠aj,且序列的最大值要尽可能小。
思路:要使得序列的最大值尽可能小,那么要使得尽可能多的不互质的(i,j)对拥有同一个值。因此我们令k从2开始,使得k的所有倍数拥有同一个值即可。思路类似埃拉托斯特尼(Eratosthenes)筛法。
【代码】
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int a[maxn]={0};
int main()
{
int n; scanf("%d",&n);
int pos=0;
for(int i=2;i<=n;i++)
if(!a[i]){
pos++;
for(int j=1;i*j<=n;j++)
if(!a[j*i]) a[j*i]=pos;
}
for(int i=2;i<=n;i++)
printf(i<n?"%d ":"%d\n",a[i]);
return 0;
}