Sherlock and His Girlfriend

测试地址:

【题目描述】

原题来自: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;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值