【2020.11.28提高组模拟】T1染色(color)

题目

题目描述

给定 \(n\),你现在需要给整数 \(1\) 到 \(n\) 进行染色,使得对于所有的 \(1\leq i<j\leq n\),若 \(i - j\) 为质数,则 \(i\) 和 \(j\) 不同色。

求出颜色尽可能少的染色方案。如果有多种方案,输出任意一种即可。

输入格式

第一行一个整数 \(n\)。

输出格式

第一行一个整数 \(k\),表示颜色数。

第二行 \(n\) 个整数 \(col_i\)(\(1 \leq col_i \leq k\)),表示 \(i\) 的颜色。

数据范围

对于\(30\%\)的数据,\(n \leq 10\);

对于 \(60\%\) 的数据,\(n \leq 20\);

对于 \(100\%\) 的数据,\(n \leq 10^4\)。

时空限制

​时间限制:1s

​空间限制:128MB

题解

规律题

\(n <8\)直接暴力

\(n \geq8\):\(col_i=(i-1)\%4+1\)

证明:

质数可以分为\(2\)和奇质数,如果按照奇偶性染色,则可以满足所有奇质数。但因为2,所以要按照\(mod\ 4\)方法染色

考虑答案是否有可能小于4?考虑\(1,3,6,8\),两两之间差都是质数,因此答案不能为3

综上:\(n <8\)直接暴力,\(n \geq8\):\(col_i=(i-1)\%4+1\)

Code

#include<cstdio>
#include<cstring>
using namespace std;
int n,ans,s[10],ans1[10];
bool bj,p[100],color[10];
bool judge()
{
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
if (p[i-j]&&s[i]==s[j]) return false;
return true;
}
void dg(int x)
{
if (x>n)
{
if (judge())
{
int sum=0;
for (int i=1;i<=4;++i)
if (color[i]) ++sum;
if (sum<ans)
{
ans=sum;
for (int i=1;i<=n;++i)
ans1[i]=s[i];
}
}
return;
}
for (int i=1;i<=4;++i)
{
s[x]=i;
bool bz=color[i];
color[i]=true;
dg(x+1);
color[i]=bz;
s[x]=0;
}
}
int main()
{
freopen("color.in","r",stdin);
freopen("color.out","w",stdout);
memset(p,true,sizeof(p));
for (int i=2;i<=8;++i)
for (int j=2;j<=8;++j)
p[i*j]=false;
p[0]=p[1]=false;
scanf("%d",&n);
if (n<8)
{
ans=10;
dg(1);
printf("%d\n",ans);
for (int i=1;i<=n;++i)
printf("%d ",ans1[i]);
}
else
{
printf("4\n");
for (int i=1;i<=n;++i)
printf("%d ",(i-1)%4+1);
}
fclose(stdin);
fclose(stdout);
return 0;
}

【2020.11.28提高组模拟】T1染色(color)的更多相关文章

  1. 【2020.11.28提高组模拟】T2 序列(array)

    序列(array) 题目描述 ​给定一个长为 \(m\) 的序列 \(a\). 有一个长为 \(m\) 的序列 \(b\),需满足 \(0\leq b_i \leq n\),\(\sum_{i=1}^ ...

  2. 【2020.11.30提高组模拟】剪辣椒(chilli)

    剪辣椒(chilli) 题目描述 在花园里劳累了一上午之后,你决定用自己种的干辣椒奖励自己. 你有n个辣椒,这些辣椒用n-1条绳子连接在一起,任意两个辣椒通过用若干个绳子相连,即形成一棵树. 你决定分 ...

  3. 【2020.11.30提高组模拟】删边(delete)

    删边(delete) 题目 题目描述 给你一棵n个结点的树,每个结点有一个权值,删除一条边的费用为该边连接的两个子树中结点权值最大值之和.现要删除树中的所有边,删除边的顺序可以任意设定,请计算出所有方 ...

  4. 【2020.12.03提高组模拟】A组反思

    估计:40+10+0+0=50 实际:40+10+0+0=50 rank40 T1 赛时看到\(n,m\leq9\),我当机立断决定打表,暴力打了几个点之后发现在\(n\ne m\)且\(k\ne0\ ...

  5. 【2020.12.01提高组模拟】A组反思

    105,rk45 T1 赛时一开始先打了\(m=0\)的情况,也就是普通的卡特兰数,然后打了暴力,样例过了,把样例改改就不行了,原因没有保证是枚举的是合法的出栈序列 得分:\(WA\&TLE1 ...

  6. 11.5NOIP2018提高组模拟题

    书信(letter) Description 有 n 个小朋友, 编号为 1 到 n, 他们每人写了一封信, 放到了一个信箱里, 接下来每个人从中抽取一封书信. 显然, 这样一共有 n!种拿到书信的情 ...

  7. 【2020.12.02提高组模拟】A组反思

    55,rk47 T1 赛时先想了\(trie\),想到不一定是前缀,然后就放弃转为打暴力 得分:\(RE22\) 正解是只用判断\(i\)与\(i+1\)的关系,那么只有两种情况,判断一下然后\(dp ...

  8. 【2020.12.01提高组模拟】卡特兰数(catalan)

    题目 题目描述 今天,接触信息学不久的小\(A\)刚刚学习了卡特兰数. 卡特兰数的一个经典定义是,将\(n\)个数依次入栈,合法的出栈序列个数. 小\(A\)觉得这样的情况太平凡了.于是,他给出了\( ...

  9. 【2020.12.02提高组模拟】球员(player)

    题目 题目描述 老师们已经知道学生喜欢睡觉,Soaring是这项记录保持者.他只会在吃饭或玩FIFA20时才会醒来.因此,他经常做关于足球的梦,在他最近的一次梦中,他发现自己成了皇家马德里足球俱乐部的 ...

随机推荐

  1. [Luogu P2831] 愤怒的小鸟 (状压DP)

    题面: 传送门:https://www.luogu.org/problemnew/show/P2831 Solution 首先,我们可以先康一康题目的数据范围:n<=18,应该是状压或者是搜索. ...

  2. 较详细的gdb入门教程

    本文主要介绍gdb的基础使用.若需了解一些技巧,请访问此篇博客:点这里 本篇教程适用于Windows,macOS及Linux,但由于Windows的自带终端很难用,所以体验可能不太好.Windows ...

  3. How to refresh datasource args caller[X++]

    To refresh  datasource args caller, you must add override method close on form like source code belo ...

  4. streamreader

    using (StreamReader sr = new StreamReader(@"C:\Documents and Settings\Administrator\桌面\1.txt&qu ...

  5. Elasticsearch 注册windows服务后,服务启动失败,意外终止

    直接双击elasticsearch.bat可以成功启动,注册成服务后就启动失败 从网上查找问题,发现是jdk版本的问题,用ES自带的jdk就可以启动成功. 默认ES会先找JAVA_HOME环境变量,如 ...

  6. 1 Prism概述

    架构目标 以模块化方式开发应用,这些模块被独立团队用WPF技术开发,集成,部署,这是使用Prism的最大好处. 最小化交叉团队依赖.允许团队在不同领域专业化,比如UI设计,商业逻辑实现,基础代码开发 ...

  7. 论文解读 - MaskGAN:BETTER TEXT GENERATION VIA FILLING IN THE _____

    1 简介 文本生成是自然语言处理中一个重要的研究领域,具有广阔的应用前景.当前主流的用来进行文本生成的模型主要是Seq2Seq模型,通常利用maximum likelihood和teacher for ...

  8. Boltzmann Machine 玻尔兹曼机入门

    Generative Models 生成模型帮助我们生成新的item,而不只是存储和提取之前的item.Boltzmann Machine就是Generative Models的一种. Boltzma ...

  9. 某C++神作,就100句话而已

    假设p是指针,当delete p;时,后面一定要p=NULL将p指向空 cin cout cerr 都是iostream类型的对象.cout<<"hello world" ...

  10. linux 进程间通信 共享内存 mmap

    共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B共享内存的意思是,同一块物理内存被映射到进程A.B各自的进程地址空间.进程A可以即时看到进程B对共享内存中数据的更新,反 ...