莫欺少年穷,修魔之旅在这开始—>算法提高课题解
思路:
1. 用线性筛预处理出所有质数
2. 如果没有合数,就只需要一种颜色,反之需要两种颜色
3. 将所有质数染成 “1”,合数染成 “2”
可参考: 筛质数
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
int primes[N],cnt;
bool st[N];
//线性筛
void init(int n)
{
for(int i=2;i<=n;i++)
{
if(!st[i]) primes[cnt++]=i;
for(int j=0;primes[j]<=n/i;j++)
{
st[primes[j]*i]=true;
if(i%primes[j]==0) break;
}
}
}
int main()
{
cin>>n;
init(n+1);
cout<<(n<3 ? 1 : 2)<<endl;
//质数染成“1”,合数染成“2”
for(int i=2;i<=n+1;i++) cout<<(!st[i] ? 1 : 2)<<' ';
return 0;
}