给定 n n n,你现在需要给整数 1 1 1 到 n n n 进行染色,使得对于所有的 1 ≤ i < j ≤ n 1\leq i<j\leq n 1≤i<j≤n,若 j − i j - i j−i 为质数,则 i i i 和 j j j 不同色。
求出颜色尽可能少的染色方案。如果有多种方案,输出任意一种即可。
第一行一个整数 n n n。
第一行一个整数 k k k,表示颜色数。
第二行 n n n 个整数 c o l i col_i coli( 1 ≤ c o l i ≤ k 1 \leq col_i \leq k 1≤coli≤k),表示 i i i 的颜色。
样例输入
7
样例输出
4
1 2 2 3 3 4 1
对于 30 % 30\% 30% 的数据, n ≤ 10 n \leq 10 n≤10;
对于 60 % 60\% 60% 的数据, n ≤ 20 n \leq 20 n≤20;
对于 100 % 100\% 100% 的数据, n ≤ 1 0 4 n \leq 10^4 n≤104。
ahsdfz noip2020模拟
容易发现, n n n 很大的时候答案最多为 4,即 1 , 2 , 3 , 4 , 1 , 2 , 3 , 4 , 1 , 2 , 3 , 4... 1,2,3,4,1,2,3,4,1,2,3,4... 1,2,3,4,1,2,3,4,1,2,3,4...因为质数中只有 2 是偶数,所以同颜色必然差为偶数,不是质数。
#include<bits/stdc++.h>
#define N 10005
using namespace std;
int read(){
int op=1,sum=0;char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-') op=-1;ch=getchar();}
while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+ch-'0',ch=getchar();
return op*sum;
}
int is[N];
inline void init(int n){
is[1]=1;
for(int i=2;i<=n;++i){
if(!is[i]){
for(int j=i+i;j<=n;j+=i)is[j]=1;
}
}
}
int b[20],v[N],tot,head[N],nex[N*1500],ver[N*1500];
inline void add(int x,int y){
nex[++tot]=head[x];head[x]=tot;ver[tot]=y;
}
int ans[N],maxn;
void dfs(int x){
v[x]=1;
for(int i=head[x];i;i=nex[i]){
int y=ver[i];
b[ans[y]]=x;
}
for(int i=1;i<=20;++i)if(b[i]!=x){
ans[x]=i;maxn=max(maxn,ans[x]);
break;
}
for(int i=head[x];i;i=nex[i]){
int y=ver[i];
if(v[y])continue;
dfs(y);
}
}
int main(){
// freopen("color.in","r",stdin);
// freopen("color.out","w",stdout);
int n=read();
if(n<=8){
init(n+1);
for(int i=1;i<=n;++i){
for(int j=i+1;j<=n;++j){
if(!is[j-i]){
add(i,j);
add(j,i);
}
}
}
for(int i=1;i<=n;++i){
if(!v[i])dfs(i);
}
printf("%d\n",maxn);
for(int i=1;i<=n;++i)printf("%d ",ans[i]);
puts("");
return 0;
}
cout<<4<<endl;
for(int i=1;i<=n;++i){
printf("%d ",(i-1)%4+1);
}
puts("");
return 0;
}