#P5657. [CSP-S 2019] 格雷码

    ID: 4970 传统题 1000ms 256MiB 尝试: 1 已通过: 1 难度: 2 上传者: 标签>位运算格雷码构造数学CSP-S2019难度/普及-来源/洛谷

[CSP-S 2019] 格雷码

P5657 [CSP-S 2019] 格雷码

题目背景

本题围绕“[CSP-S 2019] 格雷码”所描述的场景展开。普通字典序下,所有 nn 位二进制串按数值从小到大排列。

下面的题面采用非逐字重述方式整理,但保留原题中的全部判定条件、边界含义、输入输出要求与特殊约定。

题目描述

普通字典序下,所有 nn 位二进制串按数值从小到大排列。格雷码则是一种特殊排列:任意相邻两个串恰好有一位不同,并且第一个串和最后一个串也视为相邻。

本题规定使用下面的递归方式生成格雷码:

  1. 11 位格雷码依次为 01
  2. 已知 nn 位格雷码后,构造 n+1n+1 位格雷码:
    • 2n2^n 个串:把原 nn 位格雷码按原顺序排列,并在每个串前加 0
    • 2n2^n 个串:把原 nn 位格雷码按逆序排列,并在每个串前加 1

例如:

  • 22 位格雷码:00 01 11 10
  • 33 位格雷码:000 001 011 010 110 111 101 100

按照上述顺序,把 nn 位格雷码的 2n2^n 个串编号为 02n10\sim2^n-1

给定 nn 和编号 kk,请输出第 kknn 位格雷码串。

完整规则与任务要求

处理本题时,必须同时满足下列全部要求,不能只实现其中一部分:

  • 普通字典序下,所有 nn 位二进制串按数值从小到大排列。
  • 格雷码则是一种特殊排列:。
  • 任意相邻两个串恰好有一位不同,并且第一个串和最后一个串也视为相邻。
  • 本题规定使用下面的递归方式生成格雷码:。
    1. 11 位格雷码依次为 01;。
    1. 已知 nn 位格雷码后,构造 n+1n+1 位格雷码:。
  • 2n2^n 个串:。
  • 把原 nn 位格雷码按原顺序排列,并在每个串前加 0;。
  • 编号从 00 开始。
  • 输出必须恰好包含 nn 位,不足的高位必须保留为 0
  • 格雷码顺序严格使用题面给出的反射递归定义。

程序应完整读取“输入格式”中规定的所有数据,并严格按照“输出格式”给出结果。题目中的区间端点、编号起点、排序优先级、同分处理、空结构处理、取模方式和特殊字符串,均以本题面明确写出的规则为准。

所有算法还必须覆盖“数据范围”中的最小规模、最大规模及边界情况,不能只针对样例或小数据。

输入格式

一行输入两个整数 n,kn,k

输出格式

输出一行一个长度恰好为 nn 的二进制串,表示编号为 kk 的格雷码。

样例 1

2 3
10

样例 2

3 5
111

样例说明

样例编号从 00 开始,在题面规定的反射格雷码序列中定位后,输出固定长度的二进制串。

数据范围

  • 对于 50%50\% 的数据:n10n\le10
  • 对于 80%80\% 的数据:k5×106k\le5\times10^6
  • 对于 95%95\% 的数据:k2631k\le2^{63}-1
  • 对于全部数据:1n641\le n\le640k<2n0\le k<2^n

n=64n=64 时,kk 可能达到无符号 6464 位整数的范围。

题目信息来源:洛谷 P5657。

边界与子任务说明

  • 测试数据可能覆盖题面允许的最小值、最大值、重复值、空结果、无解或极端结构等边界情形。
  • 若原题未额外列出分档子任务,则所有测试点统一遵守上述完整数据范围;若题面已经列出比例或分档条件,则这些条件均应视为题面的一部分。
  • 不能根据公开样例推断未写出的额外限制。

本题面依据洛谷 P5657 的公开题目信息重新整理,为内容完整的非逐字重述版。