【题解】[CSP-S2019] 格雷码

题目描述

通常,人们习惯将所有 (n) 位二进制串按照字典序排列,例如所有 2 位二进制串按字典序从小到大排列为:00,01,10,11。

格雷码(Gray Code)是一种特殊的 (n) 位二进制串排列法,它要求相邻的两个二进制串间 恰好有一位 不同,特别地,第一个串与最后一个串也算作相邻。

所有 2 位二进制串按格雷码排列的一个例子为:00,01,11,10。

(n) 位格雷码不止一种,下面给出其中一种格雷码的生成算法:

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

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

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

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

输入格式

仅一行两个整数 (n),(k),意义见题目描述。

输出格式

仅一行一个 (n) 位二进制串表示答案。

样例 #1

2 3
10

样例 #2

3 5
111

样例 #3

44 1145141919810
00011000111111010000001001001000000001100011

【样例 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 \leq 10)

对于 (80\%) 的数据:(k \leq 5 \times 10^6)

对于 (95\%) 的数据:(k \leq 2^{63} – 1)

对于 (100\%) 的数据:(1 \leq n \leq 64), (0 \leq k \lt 2^n)

思路:

我们观察题目给的一组处理好的串(我们称每一个经处理后的格雷数为串)

000,001,011,010,110,111,101,100,

会惊奇地发现

前四个串第一位数都为0

000, 001, 011, 010)
数字的加粗好像不是很明显

后四个串第一位数都是1

110, 111, 101, 100)

然后我们从中间分开

前四个串放一起

后四个串放一起

继续看

又会惊奇地发现

前两个串的第二位都是0(0 00,0 01)设这组串为a

后两个串的第二位都是1(0 11,0 10)设这组串为b

  • 二分a(00 0,00 1
    前一个串的第三位都是0 (即前半部分)
    后一个串的第三位都是1 (即后半部分)
  • 二分b(01 1,01 0
    前一个串的第三位都是1 (即前半部分)
    后一个串的第三位都是0 (即后半部分)

前两个串的第二位都是1(1 10,1 11)设这组串为c

后两个串的第二位都是0(1 01,1 00)设这组串为d

  • 二分c(11 0,11 1
    前一个串的第三位是0 (即前半部分)
    后一个串的第三位是1 (即后半部分)
  • 二分d(10 1,10 0
    前一个串的第三位是1 (即前半部分)
    后一个串的第三位是0 (即后半部分)

我们理一下思路

就会发现一个规律:

也就是看k在上一个阶段
是在前半段
还是后半段

  • 前半段对应位数的字符则是0
  • 后半段是1

  • 前半段对应位数的字符则是1

  • 后半段是0

可以在处理的过程中直接输出

不需要存

还有一点!!

一定要用unsigned long long !!!!!

下面给出代码

#include
#include
#include

using namespace std;

unsigned long long k,bk;
int n;
bool flag;

int main()
{
    cin>>n>>k;
    bk=pow(2,n-1);//从0开始编号则n-1

    while(bk)//直到长度为0
    {
        if(!flag)
        {
        if(k < bk) cout<= bk)
            {
            cout<= bk) { //如果k大于bk则在后半段
        cout<>= 1;//每次去掉一半,k在前半段则去掉后半段长度,
                                          在后半段则去掉前半段长度
    }

    return 0;
}

Original: https://www.cnblogs.com/watasky/p/16448948.html
Author: watasky
Title: 【题解】[CSP-S2019] 格雷码

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/604116/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 分享一个让我进入阿里中间件的个人项目

    作者: vangoleo官网: http://www.vangoleo.com/iris-java/ 背景 时光荏苒,进入阿里中间件团队已经快两年时间了。这期间,有幸参与了第四届中…

    数据结构和算法 2023年6月7日
    088
  • 试除法判断约数 和 试除法判断质数

    约数和质数是我们在认识数学问题中经常遇到的两个概念,所以如何判断他们肯定也是我们需要去考虑! 首先我们看一些判断质数: 因为我们可以知道质数的概念指的是这个数只能被1和自身整除,所…

    数据结构和算法 2023年6月7日
    070
  • 数论-剩余类、完全剩余系、缩系、欧拉函数

    剩余类: ∀ 0≤r≤m-1(m≥1),Cr={x∈Z | x≡ r (mod m)}={m*q+r|q∈Z}=r,则C0,C1,C2,…,Cm-1为模m的剩余类(共有…

    数据结构和算法 2023年6月7日
    0113
  • 快速排序-quickSort

    快速排序(代码) 写这篇文章之前至少做了不下十遍快排,但现在仍然不能保证一写就A,故记录一下。 partition过程的边界条件不是很好弄,因此面试经常出现。 partition单…

    数据结构和算法 2023年6月8日
    076
  • 随笔3

    你最珍贵 世间万物在时间的长河里流转,转瞬间消逝,没有什么能阻止它们离开的脚步。或许,唯有冠名”珍贵”二字才能稍稍挽留一下它们匆匆的身影。 什么是珍贵的?或…

    数据结构和算法 2023年6月7日
    073
  • 电子科技大学2022暑假前集训 图论专题

    跑 (n-1) 次最大流,每次以 (1) 为源点,(i) 为汇点。然后就过了((PS:此题实际上是 Stoer-Wagner 模板题) 首先肯定是跑最小生成树。那么每次合并两个集合…

    数据结构和算法 2023年6月12日
    066
  • 计算机三级信息安全笔记(填空题)

    1.计算机系统安全评估的第一个正式标准是 TCSEC标准(可信计算机评估标准) 2.信息安全的发展大致经历了三个主要阶段, 通信保密阶段,计算机安全阶段和信息安全保 障阶段 3.由…

    数据结构和算法 2023年6月12日
    079
  • APIO2022 打金记

    主场作战,优势在我! -2900¥。 中午在学校吃过饭来酒店签到,喜获电脑包一个,卫衣一件,饭票若干。 被要求在大厅录视频并喊出 “APIO2022,我们来了&#822…

    数据结构和算法 2023年6月12日
    0106
  • C语言大作业—学生信息管理系统

    xxxx信息管理系统 简介 因为大作业规定的踩分项就那么多,为了不浪费时间 + 得分,就写成这样。现在看看,命名不规范,书写风格糟糕,全塞在一个源代码中······ 不过,应付大作…

    数据结构和算法 2023年6月12日
    091
  • 斜率优化动态规划 学习笔记

    首先看这样一个问题: 洛谷 P3195 [HNOI2008]玩具装箱题目大意:有 (n) 个物品排成一行,第 (i) 个物品权值为 (C_i) ,现要求将这些物品分成若干段,每段的…

    数据结构和算法 2023年6月12日
    089
  • C++ “链链”不忘@必有回响之双向链表

    C++ “链链”不忘@必有回响之双向链表 1. 前言 写过一篇与 &#x5355;&#x94FE;&#x8868;相关的博文 &am…

    数据结构和算法 2023年6月7日
    097
  • Python代码风格推荐(谷歌、PEP8)

    引言 一直都觉得好的代码风格就像是好看的电脑桌面,一定要简洁并且遵循一定的规范,之前写代码一直觉得有些随意,这样很不好,于是整理了一些实用的规范,以后尽量写一下好的代码。 在Pyt…

    数据结构和算法 2023年6月12日
    0102
  • 珂朵莉树

    珂朵莉 我永远喜欢珂朵莉。 如果幸福有颜色,那一定是终末之红染尽的蓝色! 一个 dalao 的 图 。 萌娘百科: 珂朵莉树 珂朵莉树是基于 set 的暴 (pian) 力 (fe…

    数据结构和算法 2023年6月12日
    0107
  • 单调栈

    栈 栈是 OI 中常用的一种线性数据结构。 栈的修改是按照后进先出的原则进行的,因此栈通常被称为是后进先出(last in first out)表,简称 LIFO 表。 下文均使用…

    数据结构和算法 2023年6月12日
    0116
  • 排序入门笔记

    排序是指按照一定的方法将无序或者有序的数组排列成有序的数组。这里以升序为例。 初等排序一共有两种排序方法,一种是选择排序一种插入排序: 首先介绍选择排序,选择排序的目标是每次选出最…

    数据结构和算法 2023年6月12日
    064
  • AcWing 188. 武士风度的牛(搜索)

    题目链接 题目描述 农民 John 有很多牛,他想交易其中一头被 Don 称为 The Knight 的牛。这头牛有一个独一无二的超能力,在农场里像 Knight 一样地跳(就是我…

    数据结构和算法 2023年6月16日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球