• 一本通1623Sherlock and His Girlfriend


    1623:Sherlock and His Girlfriend

    时间限制: 1000 ms         内存限制: 524288 KB

    【题目描述】

    原题来自: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≤105 。

    sol:第一眼看上去很难的样子(然后发现是质因数),于是可知最多分成两类,一类质数,一类非质数

    Ps:n+1=2和n+1=3要特判下,因为 2,3两个数可以放一起,于是只有一类

    #include <bits/stdc++.h>
    using namespace std;
    typedef int ll;
    inline ll read()
    {
        ll s=0;
        bool f=0;
        char ch=' ';
        while(!isdigit(ch))
        {
            f|=(ch=='-'); ch=getchar();
        }
        while(isdigit(ch))
        {
            s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
        }
        return (f)?(-s):(s);
    }
    #define R(x) x=read()
    inline void write(ll x)
    {
        if(x<0)
        {
            putchar('-'); x=-x;
        }
        if(x<10)
        {
            putchar(x+'0'); return;
        }
        write(x/10);
        putchar((x%10)+'0');
        return;
    }
    #define W(x) write(x),putchar(' ')
    #define Wl(x) write(x),putchar('
    ')
    const int N=100005;
    int n;
    bool Bo[N];
    int Prime[N];
    inline void Get_Prime()
    {
        int i,j;
        for(i=2;i<=n;i++)
        {
            if(!Bo[i]) Prime[++*Prime]=i;
            for(j=1;j<=*Prime&&Prime[j]*i<=n;j++)
            {
                Bo[Prime[j]*i]=1;
                if(i%Prime[j]==0) break;
            }
        }
        return;
    }
    int main()
    {
        int i;
        n=read()+1;
        if(n==2) return 0*printf("1
    1
    ");
        if(n==3) return 0*printf("1
    1 1
    ");
        Get_Prime();
        puts("2");
        for(i=2;i<=n;i++)
        {
            W((Bo[i])?(2):(1));
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Linux系统中的load average
    通过数据库评估存储设备IO性能-Oracle11gIO校准功能介绍
    ORACLE查询字段中含有空格的数据
    JavaScript&Typescript中的时间
    LeetCode
    LeetCode
    面试问题及知识汇总
    Bootstrap布局容器与栅格系统
    JVM垃圾回收(GC)
    9. 专题
  • 原文地址:https://www.cnblogs.com/gaojunonly1/p/10425807.html
Copyright © 2020-2023  润新知