Sherlock and His Girlfriend

    技术2022-07-13  82

    测试地址:

    【题目描述】

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

     

     

    Processed: 0.029, SQL: 9