LOJ10201
题目描述
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 }