「CF779B」「LOJ#10201.」「一本通 6.2 练习 4」Sherlock and His Girlfriend(埃氏筛

题目描述

原题来自:Codeforces Round #400 B.

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≤1051le nle 10^51n105

题解

论读题的重要性系列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 }
原文地址:https://www.cnblogs.com/qwerta/p/9839843.html