列表

详情


NC50556. Sherlock and His Girlfriend

描述

Sherlock有了一个新女友(这太不像他了!)。情人节到了,他想送给女友一些珠宝当做礼物。
他买了n件珠宝。第i件的价值是i+1。那就是说,珠宝的价值分别为
Watson挑战Sherlock,让他给这些珠宝染色,使得一件珠宝的价格是另一件的质因子时,两件珠宝的颜色不同。并且,Watson要求他最小化颜色的使用数。
请帮助Sherlock完成这个简单的任务。

输入描述

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

输出描述

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

示例1

输入:

3

输出:

2
1 1 2

示例2

输入:

4

输出:

2
2 1 1 2

说明:

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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 24ms, 内存消耗: 948K, 提交时间: 2023-07-07 09:01:03

#include <bits/stdc++.h>
using namespace std;
int a[100010];

int prime(int n)
{
	for(int i=2;i<=sqrt(n);i++){
		if(n%i==0)
			return 0;
	}
	return 1;
}

int main()
{
	int n;
	cin>>n;
	for(int i=2;i<=n+2;i++){
		if(prime(i))
			a[i]=1;
		else
			a[i]=2;
	}
	if(n<3)
		cout<<1<<endl;
	else
		cout<<2<<endl;
	for(int i=2;i<n+2;i++){
		cout<<a[i]<<" ";
	}
	return 0;
 } 

C++14(g++5.4) 解法, 执行用时: 14ms, 内存消耗: 888K, 提交时间: 2019-08-21 22:08:42

#include<bits/stdc++.h>
using namespace std;
int ans[100005];
int main(){
	int n;
	scanf("%d",&n);
	int mx=1;
	memset(ans,0,sizeof(ans));
	for(int i=2;i<=n+1;i++){
		if(ans[i]==0){
			ans[i]=1;
			int t=ans[i];
			for(int j=i*2;j<=n+1;j+=i)
				ans[j]=2,mx=max(mx,ans[j]);
		}
	}
	printf("%d\n",mx);
	for(int i=2;i<=n+1;i++)
		printf("%d ",ans[i]);
	return 0;
}

上一题