Sherlock and His Girlfriend(信息学奥赛一本通 1623)
【题目描述】
原题来自:Codeforces Round #400 B.
Sherlock 有了一个新女友(这太不像他了!)。情人节到了,他想送给女友一些珠宝当做礼物。
他买了 n 件珠宝。第 i 件的价值是 i+1。那就是说,珠宝的价值分别为 2,3,4,⋯,n+1。
Watson 挑战 Sherlock,让他给这些珠宝染色,使得一件珠宝的价格是另一件的质因子时,两件珠宝的颜色不同。并且,Watson 要求他最小化颜色的使用数。
请帮助 Sherlock 完成这个简单的任务。
【输入】
只有一行一个整数 n,表示珠宝件数。
【输出】
第一行一个整数 k,表示最少的染色数;
第二行 n 个整数,表示第 1 到第 n 件珠宝被染成的颜色。若有多种答案,输出任意一种。
【输入样例】
3
【输出样例】
2 1 1 2
【提示】
样例输入 2
4
样例输出 2
2 2 1 1 2
样例说明
因为 2 是 4 的一个质因子,因此第一件珠宝与第三件珠宝的颜色必须不同。
数据范围与提示:
对于全部数据,1≤n≤105 。
一看到这道题就想到可以把素数分一类、约数分一类了吧,然鹅我还是想得太简单惹,忘记了特判n==1、n==2的情况
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e6+1; 4 int a[N],n,cnt,v[N]; 5 int read() 6 { 7 int x=0,f=1; 8 char ch=getchar(); 9 while(ch<'0'||ch>'9') 10 { 11 if(ch=='-') f=-1; 12 ch=getchar(); 13 } 14 while(ch>='0'&&ch<='9') 15 { 16 x=x*10+ch-'0'; 17 ch=getchar(); 18 } 19 return x*f; 20 } 21 void write(int x) 22 { 23 if(x<0) 24 { 25 putchar('-'); 26 x=-x; 27 } 28 if(x>9) write(x/10); 29 putchar(x%10+'0'); 30 } 31 void pre() 32 { 33 for(int i=2;i<=1000000;i++) 34 { 35 if(!v[i])a[++cnt]=i; 36 for(int j=1;j<=cnt&&a[j]*i<=1000000;j++) 37 { 38 v[i*a[j]]=1; 39 if(i%a[j]==0)break; 40 } 41 } 42 } 43 int main() 44 { 45 46 n=read(); 47 if(n+1==2) 48 { 49 putchar('1'); 50 putchar('\n'); 51 putchar('1'); 52 putchar('\n'); 53 return 0; 54 } 55 if(n+1==3) 56 { 57 putchar('1'); 58 putchar('\n'); 59 putchar('1'); 60 putchar(' '); 61 putchar('1'); 62 putchar('\n'); 63 return 0; 64 } 65 pre(); 66 putchar('2');putchar('\n'); 67 for(int i=2;i<=n+1;i++) 68 { 69 if(!v[i])putchar('1'); 70 else putchar('2'); 71 putchar(' '); 72 } 73 return 0; 74 }