输入文件:2019code.in 输出文件:2019code.out
时间限制:1 s 内存限制:256 MB
【题目描述】
通常,人们习惯将所有 n 位二进制串按照字典序排列,例如所有 2 位二进制串按字典序从小到大排列为:00,01,10,11。
格雷码(Gray Code)是一种特殊的 n 位二进制串排列法,它要求相邻的两个二进制串间恰好有一位不同,特别地,第一个串与最后一个串也算作相邻。

上面这些话并没有什么用

所有 2 位二进制串按格雷码排列的一个例子为:00,01,11,10。
n 位格雷码不止一种,下面给出其中一种格雷码的生成算法:
1 位格雷码由两个 1 位二进制串组成,顺序为:0,1。n+1 位格雷码的前 2n 个二进制串,可以由依此算法生成的 n 位格雷码(总共 2n 个 n 位二进制串)按顺序排列,再在每个串前加一个前缀 0 构成。n+1 位格雷码的后 2n 个二进制串,可以由依此算法生成的 n 位格雷码(总共 2n 个 n 位二进制串)按逆序排列,再在每个串前加一个前缀 1 构成。

综上,n+1 位格雷码,由 n 位格雷码的 2n 个二进制串按顺序排列再加前缀 0,和按逆序排列再加前缀 1 构成,共 2n+1 个二进制串。另外,对于 n 位格雷码中的 2n 个 二进制串,我们按上述算法得到的排列顺序将它们从 0∼2n−1 编号。

按该算法,2 位格雷码可以这样推出:

已知 1 位格雷码为 0,1。前两个格雷码为 00,01。后两个格雷码为 11,10。合并得到 00,01,11,10,编号依次为 0∼3。

同理,3 位格雷码可以这样推出:

已知 2 位格雷码为:00,01,11,10。前四个格雷码为:000,001,011,010。后四个格雷码为:110,111,101,100。合并得到:000,001,011,010,110,111,101,100,编号依次为 0∼7。

现在给出 n,k,请你求出按上述算法生成的 n 位格雷码中的 k 号二进制串。

【输入格式】
仅一行两个整数 n,k,意义见题目描述。

【输出格式】
仅一行一个 n 位二进制串表示答案。

【样例输入1】
2 3
【样例输出1】
10
【样例输入2】
3 5
【样例输出2】
111
【样例输入3】
64 8894641145141919810
【样例输出3】
0100011011001000000100101000000110010110101000110000000001100011
【样例解释】
样例1:

2 位格雷码为:00,01,11,10,编号从 0∼3,因此 3 号串是 10。

样例2:

3 位格雷码为:000,001,011,010,110,111,101,100,编号从 0∼7,因此 5 号串是 111。

【数据规模与约定】
对于50%的数据:n ≤ 10

对于80%的数据:k ≤ 5000000

对于95%的数据:k ≤ 2 ^ 63 − 1

对于100%的数据:1 ≤ n ≤ 64,0 ≤ k < 2 ^ n

【分析】
emmmmm,闲来无事乱翻往年NOIP的题目
发现这一题有骗分 写的价值
第一眼看过去我就蒙了,这题目怎么这么长,用来迷惑我们吗
看了半天,我总结出几个要点:
1.n位的格雷码编号依次为0 - 2 ^ n - 1
2.n + 1位格雷码的求法:前2 ^ n个:将n位格雷码顺序排列,然后在前面加上0;后2 ^ n个:将n位格雷码逆序排列,然后在前面加上1
3.题目写这么长就是吓唬人的
4.我上面说的都是废话

【我的解法】
翻了翻大佬的代码,发现大多是用的二分,然而我的二分非常烂,看不懂,所以这里只提供我的递归解法
我们写一个递归函数,用来输出n位格雷码的第k号
首先要取一个中间值x,因为前2 ^ n个格雷码的首位是0,后2 ^ n个格雷码首位是1,所以判断一下,直接输出
然后就是卡了我半天的递归(太菜了QAQ)
首先,前2 ^ (n - 1)个格雷码是顺序的,所以直接递归调用n - 1位格雷码的第k号就行,但是后2 ^ (n - 1)个格雷码是逆序的,所以要调用n - 1位格雷码的第x - 1 - k + x号,这里可以根据样例一点一点推出来
注意:这里不要把两个x合在一起,因为x最大为2 ^ 63,如果把两个x合在一起,就会爆unsigned long long
接下来就是愉快地敲代码了~~

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef unsigned long long ULL;
void dfs(int n,ULL k){if(n <= 0)return ;if(n == 1){if(k == 0){printf("0");}else printf("1");return ;}ULL x = ULL(pow(2 , n - 1));//取中间号if(k < x){//如果在前半段printf("0");dfs(n - 1,k);} else{//如果在后半段printf("1");dfs(n - 1,x - 1 - k + x);}return ;
}
int main(){int n;ULL k;scanf("%d%llu",&n,&k);dfs(n , k);fclose(stdin);fclose(stdout);return 0;
}

【CSP 2019】格雷码相关推荐

  1. 通信系统未编码、卷积码与格雷码的仿真性能比较

    通信系统未编码.卷积码与格雷码的仿真性能比较 论文+代码+仿真结果:下载地址 以上仿真结果可知: 1.未编码.卷积编码和格雷码三种编码,经PSK调制后加AWGN(高斯白噪声),在经过解调和解码得出来的 ...

  2. 格雷码编码+解码+实现(Python)

    01 二值码 02 格雷码编码 2.1 编码优点 2.2 编码生成 2.3 递归生成 2.4 二值码转换 2.5 编码图 03 格雷码投影 3.1 投影图案生成 3.2 DLP投影图像 04 格雷码解 ...

  3. 直播回顾|基于格雷码结合相移技术的高鲁棒性高效率动态三维面形测量

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 大家好,本公众号现已开启线上视频公开课,主讲人通过B站直播间(bilibili号:3D视觉工坊:htt ...

  4. 重磅直播|基于格雷码结合相移技术的高鲁棒性高效率动态三维面形测量

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 大家好,本公众号现已开启线上视频公开课,主讲人通过B站直播间,对3D视觉领域相关知识点进行讲解,并在微 ...

  5. 二进制与格雷码之间的转换的Verilog实现(更多一点的讨论)

    目录 前言 二进制码转换为格雷码的方法 格雷码转换为二进制码的过程 更多一点讨论之generate for 更多一点讨论之for 最后对格雷码的介绍 前言 以前的博客也有写这方面的内容,只是没有显式的 ...

  6. FPGA中有限状态机的状态编码采用格雷码还是独热码?

    今天看<从算法设计到硬件逻辑的实现>这本电子书时,遇到了一个问题,就是有限状态机的编写中,状态编码是采用格雷码还是独热码呢?究竟采用哪一种编码呢? 采用独热码为什么节省许多组合电路? 等等 ...

  7. Verilog中状态机编码方式的选择:二进制编码(Binary)、格雷码(Gray-code)编码、独热码(One-hot)编码

    一般的,在Verilog中最常用的编码方式有二进制编码(Binary).格雷码(Gray-code)编码.独热码(One-hot)编码. 二进制码和格雷码是压缩状态编码. 若使用格雷编码,则相邻状态转 ...

  8. 3位格雷码的顺序编码_FPGA 设计之 跨时钟域(四 - 格雷码)

    上一篇文章总结了四种常用的多比特跨时钟域的设计.这篇我们主要来看一下 格雷码,文章目录如下: 什么是格雷码 格雷码转二进制码 二进制码转格雷码 N比特格雷码转N-1比特格雷码 什么是格雷码 ? A G ...

  9. 3位格雷码的顺序编码_绝对值编码器当中的格雷码

    格雷码:又叫循环二进制码或反射二进制码.格雷码是我们在旋转编码器中常会遇到的一种编码方式. 格雷码的特点: 任意两个相邻的代码只有一位二进制数不同: 循环码,0和最大数(2^n-1)之间只有一位不同: ...

最新文章

  1. Android中获取屏幕的宽和高
  2. 记录某段程序的运行时间
  3. HDU 2087剪花布条 KMP
  4. 浏览器svg插件_Archer-svgs: 异步加载svg方案
  5. 【服务端渲染】手动部署 NuxtJs 项目
  6. OPPO K9 Pro将于9月26日登场:搭载天玑1200旗舰游戏芯
  7. 为一路通(16tone)开博
  8. java取整和四舍五入方法
  9. Minimax算法与Alpha-Beta算法
  10. 苹果公司向中国征收30%苹果税
  11. 浅析Relaxed Ordering对PCIe系统稳定性的影响
  12. 【夜读】自我提升的8个好习惯,迷茫时看一看
  13. android弹球动画,FlingAnimation/SpringAnimation实现弹球动画
  14. Go GUI---lxn/walk 自带demo学习---16.notifyicon通知图标
  15. 栈中的peek()、pop()和push()、Add()方法
  16. Python基础语法(五)—常用模块和模块的安装和导入
  17. 拼多多如何撤销退店?万顿思教育
  18. 〖Python 数据库开发实战 - MySQL篇⑮〗- 数据表结果集的排序与去除重复(去重)
  19. vs code的设置
  20. java计算机毕业设计学生日常事务管理系统源码+mysql数据库+lw文档+系统+调试部署

热门文章

  1. ATTCK实战系列-红队评估(三)WP
  2. StreamSets
  3. 5分钟快速 搭建免费好用的图床(Picx +github)
  4. 循环语句中 break 和 continue 的使用,while for switch循环中如何跳出循环 中断循环
  5. uboot移植项目总结
  6. Unable to import maven project: See logs for details错误解决方法
  7. OpenWrt 学习笔记【6】配置USB驱动
  8. 方便日常电脑操作的小软件及常见电脑故障修复方法(不断更新)
  9. 订货订单管理系统架构介绍视频
  10. Android P的APP适配总结,让你快人一步