LOJ10201

匿名 (未验证) 提交于 2019-12-02 23:57:01

题目描述

原题来自:Codeforces Round #400 B.

Sherlock 有了一个新女友(这太不像他了!)。情人节到了,他想送给女友一些珠宝当做礼物。

他买了n  件珠宝。第i  件的价值是 i+1。那就是说,珠宝的价值分别为2,3,4,....,n+1 

Watson 挑战 Sherlock,让他给这些珠宝染色,使得一件珠宝的价格是另一件的质因子时,两件珠宝的颜色不同。并且,Watson 要求他最小化颜色的使用数。

请帮助 Sherlock 完成这个简单的任务。

输入格式

只有一行一个整数n ,表示珠宝件数。

输出格式

第一行一个整数 k,表示最少的染色数;
第二行 n 个整数,表示第 1 到第 n 件珠宝被染成的颜色。若有多种答案,输出任意一种。

样例

样例输入 1

3

样例输出 1

2 1 1 2

样例输入 2

4

样例输出 2

2 2 1 1 2

样例说明

因为 2 是4  的一个质因子,因此第一件珠宝与第三件珠宝的颜色必须不同。

数据范围与提示

对于全部数据,n<=1e5

_____________________________________________

每个值和它的质因子不能同色,而质数之间、合数之间是没有颜色限制的,所以,这不就是二分图染色嘛,而且不用染,直接质数一色,和数一色。

注意,n为1和2的情况,也就是只有2,3两个值,这时只有一种颜色。

_____________________________________________

 1 #include<bits/stdc++.h>  2 using namespace std;  3 typedef long long ll;  4 const ll maxn=100003;  5 int n;  6 bool zs[maxn];  7   8 void getss()  9 { 10     zs[0]=zs[1]=1; 11     for(int i=2;i<sqrt(maxn);++i) 12     { 13         if(zs[i]==0) 14         { 15             for(int j=i*i;j<maxn;j+=i) 16                 zs[j]=1; 17         } 18     } 19 } 20 int main() 21 { 22     scanf("%d",&n); 23     getss(); 24     if(n==1) 25     { 26         printf("1\n1"); 27     } 28     else if(n==2) 29     { 30         printf("1\n1 1"); 31     } 32     else 33     { 34         printf("2\n"); 35         for(int i=2;i<n+2;++i) 36             printf("%d ",zs[i]?2:1); 37     } 38     return 0; 39 }
View Code

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!