题面
Sherlock 有了一个新女友(这太不像他了!)。情人节到了,他想送给女友一些珠宝当做礼物。
他买了 $n$ 件珠宝。第 $i$ 件的价值是 $i+1$ 。那就是说,珠宝的价值分别为 $2,3,4,.. ,n+1$ 。
Watson 挑战 Sherlock,让他给这些珠宝染色,使得一件珠宝的价格是另一件的质因子时,两件珠宝的颜色不同。并且,Watson 要求他最小化颜色的使用数。
请帮助 Sherlock 完成这个简单的任务。
输入格式
只有一行一个整数 $n$,表示珠宝件数。
输出格式
第一行一个整数 $k$,表示最少的染色数;
第二行 $n$ 个整数,表示第 $1$ 到第 $n$ 件珠宝被染成的颜色。若有多种答案,输出任意一种。
思路
对于这一段区间内的所有合数,他们一定不互为质因子(都不是质数了当然不互为质因子),所以只需要把区间内的质数全部染上一种颜色,合数染上另一种颜色,只需 2 种颜色。
注意:当 $n<=2$ 时,只需要一种颜色,所以要特判。
代码
#include<bits/stdc++.h>
using namespace std;
int pr[1000005]={2};
long long top=0;
int is[1000005];
int n;
void prime_oulashai(){
top=1;
for (int i=2;i<=1000000;i++){
if (!is[i]){
pr[top++]=i;
}
for (int j=0;j<=top-1;j++){
if (i*pr[j]>1000000){
break;
}
is[i*pr[j]]=1;
if (i%pr[j]==0){
break;
}
}
}
}
int main(){
cin>>n;
if (n==1){
cout<<"1\n1";
return 0;
}
if (n==2){
cout<<"1\n1 1";
return 0;
}
prime_oulashai();
is[2]=0;
cout<<2<<endl;
for (int i=1;i<=n;i++){
if (is[i+1]){
cout<<1<<" ";
}else{
cout<<2<<" ";
}
}
}