Codeforces Round #400 (Div. 1 + Div. 2, combined) 776B Sherlock and his girlfriend

时间限制: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 ");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值