题目描述
Sherlock 有了一个新女友(这太不像他了!)。情人节到了,他想送给女友一些珠宝当做礼物。
他买了 nnn 件珠宝。第 iii 件的价值是 i+1i+1i+1。那就是说,珠宝的价值分别为 2,3,4,⋯,n+12,3,4,\cdots ,n+12,3,4,⋯,n+1。
Watson 挑战 Sherlock,让他给这些珠宝染色,使得一件珠宝的价格是另一件的质因子时,两件珠宝的颜色不同。并且,Watson 要求他最小化颜色的使用数。
请帮助 Sherlock 完成这个简单的任务。
输入格式
只有一行一个整数 nnn,表示珠宝件数。
输出格式
第一行一个整数 kkk,表示最少的染色数;
第二行 nnn 个整数,表示第 111 到第 nnn 件珠宝被染成的颜色。若有多种答案,输出任意一种。
样例
样例输入 1
3
样例输出 1
2
1 1 2
样例输入 2
4
样例输出 2
2
2 1 1 2
样例说明
因为 222 是 444 的一个质因子,因此第一件珠宝与第三件珠宝的颜色必须不同。
数据范围与提示
对于全部数据,1≤n≤1051\le n\le 10^51≤n≤105。
题解
论读题的重要性系列qwq
因为麻烦的只有质数,所以把质数染成1,把其它的数染成2就行了。
1 编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间 2 #241498 #10201. 「一本通 6.2 练习 4」Sherlock and His Girlfriend Accepted 100 65 ms 316 KiB C++ / 393 B qwerta 2018-10-23 21:21:17 3 #include<iostream> 4 #include<cstdio> 5 using namespace std; 6 bool sf[100003]; 7 int main() 8 { 9 //freopen("a.in","r",stdin); 10 int n; 11 scanf("%d",&n); 12 n++; 13 int flag=0; 14 //埃氏筛 15 for(int i=2;i<=n;++i) 16 if(!sf[i]) 17 { 18 for(int j=i+i;j<=n;j+=i) 19 { 20 flag++; 21 sf[j]=1; 22 } 23 } 24 if(!flag) 25 cout<<1<<endl; 26 else cout<<2<<endl; 27 for(int i=2;i<=n;++i) 28 printf("%d ",sf[i]+1); 29 return 0; 30 }