时间限制:1S / 空间限制:256MB
【在线测试提交传送门】
【问题描述】
Sherlock has a new girlfriend (so unlike him!). Valentine's day is coming and he wants to gift her some jewelry. He bought n pieces of jewelry. The i-th piece has price equal to i + 1, that is, the prices of the jewelry are 2, 3, 4, ... n + 1. Watson gave Sherlock a challenge to color these jewelry pieces such that two pieces don't have the same color if the price of one piece is a prime divisor of the price of the other piece. Also, Watson asked him to minimize the number of different colors used. Help Sherlock complete this trivial task. 项链由n颗珠子组成,第i颗珠子的价格是i+1,即则n颗珠子的价格分别是2,3,4……n+1。对于两颗珠子x和y,若x是y的质因子,则这两颗珠子不能同色。请使用最少的颜色种类数,给这些珠子涂上颜色。
【输入格式】
The only line contains single integer n (1 ≤ n ≤ 100000) — the number of jewelry pieces. 一行一个整数n(1 ≤ n ≤ 100000),表示珠子的数量。
【输出格式】
The first line of output should contain a single integer k, the minimum number of colors that can be used to color the pieces of jewelry with the given constraints. The next line should consist of n space-separated integers (between 1 and k) that specify the color of each piece in the order of increasing price. If there are multiple ways to color the pieces using k colors, you can output any of them. 第一行,一个整数k,表示最少的颜色种类数量。 第二行,包含n个整数,范围在1到k之间,依次表示各个珠子的颜色编号。可能有多种方案,输出其中的任意一种。
【输入样例1】
3
【输出样例1】
2 1 1 2
【输入样例2】
4
【输出样例2】
2 2 1 1 2
慎入:以下为解题思路和参考代码,请务必先自行思考
【解题思路】
预处理出1e5之内的所有素数,将素数处理过程中的基数设定为颜色1,其他的数字设定为颜色2即可。
那么就用两种颜色就能完成这个目的
【参考代码】
#include<cstdio>
#include<algorithm>
using namespace std;
int w[101000], n;
int main(){
int i, j;
scanf("%d",&n);
for(i=2;i<=n+1;i++){
for(j=i+i;j<=n+1;j+=i){
w[j] = 1;
}
}
if(n<=2){
printf("1\n");
for(i=1;i<=n;i++)printf("%d ",1);
return 0;
}
printf("2\n");
for(i=1;i<=n;i++){
if(!w[i+1])printf("1 ");
else printf("2 ");
}
}