题目描述
给定 nnn,你现在需要给整数 111 到 nnn 进行染色,使得对于所有的 1≤i<j≤n1\leq i<j\leq n1≤i<j≤n,若 j−ij - ij−i 为质数,则 iii 和 jjj 不同色。
求出颜色尽可能少的染色方案。如果有多种方案,输出任意一种即可。
输入格式
第一行一个整数 nnn。
输出格式
第一行一个整数 kkk,表示颜色数。
第二行 nnn 个整数 colicol_icoli (1≤coli≤k1 \leq col_i \leq k1≤coli≤k),表示 iii 的颜色。
样例
样例输入
7
样例输出
4
1 2 2 3 3 4 1
数据范围与提示
对于 30%30\%30% 的数据,n≤10n \leq 10n≤10;
对于 60%60\%60% 的数据,n≤20n \leq 20n≤20;
对于 100%100\%100% 的数据,n≤104n \leq 10^4n≤104 。
SOLUTION
方案一: 由于质数除了 222 以外都是奇数,所以有一种必然可行的方案:
1 1 2 2 3 3⋯1\ 1\ 2\ 2\ 3\ 3\cdots1 1 2 2 3 3⋯
该方案所需的颜色种类为 ⌈n2⌉\lceil \frac{n}{2} \rceil⌈2n⌉ 。
方案二: 而又由于这个性质,所以我们让每两个相同的颜色的对应数值之差都是偶数的时候也可行。除了 222 外,最小可选 444 ,于是构造如下方案:
1 2 3 4 1 2 3 4⋯1\ 2\ 3\ 4\ 1\ 2\ 3\ 4\cdots1 2 3 4 1 2 3 4⋯
因此每种方案最多只需要 444 种颜色。
又当 n≤6n \le 6n≤6 时,采取方案一 ⌈n2⌉<4\lceil \frac{n}{2} \rceil < 4⌈2n⌉<4,
因此分类讨论即可。
CODE
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n;
int main()
{
scanf("%d", &n);
if(n <= 6)
{
printf("%d\n", (n + 1) >> 1);
for(register int i = 1; i <= n; i ++ ) printf("%d ", (i + 1) >> 1);
putchar('\n');
}
else
{
printf("4\n");
for(register int i = 1; i <= n; i ++ ) printf("%d ", i % 4 + 1);
putchar('\n');
}
return 0;
}
END.