测试地址:☞
【题目描述】
原题来自: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≤10^5 。
【思路】
素数输出 1,非素数输出 2
【AC代码】
#include<cstdio>
#include<cstring>
const int maxn = 1e5+7;
bool u[maxn];
int su[maxn];
int t;
void prime(){
t = 1;
memset(u, true, sizeof(u));
for(int i = 2; i <= maxn; i++){
if(u[i]) su[t++] = i;
for(int j = 1; j < t; j++){
if(i*su[j] > maxn) break;
u[i*su[j]] = false;
if(i%su[j] == 0) break;
}
}
return ;
}
int main(){
prime();
int n;
scanf("%d", &n);
if(n == 1) printf("1\n1");
else if(n == 2) printf("1\n1 1\n");
else{
printf("2\n");
for(int i = 2; i <= n+1; i++){
if(u[i]) printf("1 ");
else printf("2 ");
}
}
return 0;
}