#2005. 海明码(Hamming.cpp)

海明码(Hamming.cpp)

题目描述

在计算机科学中,海明距离是衡量两个等长二进制字符串之间不同位数的一个标准。这个概念被广泛用于编码理论中,特别是在纠错码的设计中。现在,给定两个整数 NNDD,要求你找出 NN 个由 0011 组成的编码,使得任意两个编码之间的海明距离至少为 DD

海明距离的定义如下:对于两个编码,它们的二进制表示中不同的二进制位的个数就是它们的海明距离。例如,考虑以下两个十六进制数:

  • 0x554(对应二进制 (0101 0101 0100)20x554 \text{(对应二进制 } (0101\ 0101\ 0100)_2\text{)}
  • 0x234(对应二进制 (0010 0011 0100)20x234 \text{(对应二进制 } (0010\ 0011\ 0100)_2\text{)}

将它们的二进制表示对齐后比较,可以发现第 66779910101111 位不同,因此它们的海明距离是 55

你的任务是输出满足以下条件的 NN 个编码:

  1. 它们的二进制表示中任意两两之间的海明距离都不少于 DD
  2. 如果有多个符合条件的解,则要求输出的编码在十进制下的数值尽可能小。

输入格式

一行输入两个整数 NNDD,用空格隔开。

  • 1N641 \leq N \leq 64
  • 1D71 \leq D \leq 7

输出格式

输出 NN 个十进制表示的编码,按照数值从小到大排序,每行最多输出 1010 个编码。如果有多个方案,要求输出使得二进制数值最小的解。

样例

16 3
0 7 25 30 42 45 51 52 75 76
82 85 97 102 120 127

说明/提示

请解释:"必须与其他所有的数相比,Hamming距离都符合要求,这个数才正确"

答:如样例输出,007700252500 和……比较都符合海明码,同样 77252577303077 和……比较也符合要求,以此类推。 就这样了。 题中至少有 DD 个单位,意思就是大于等于 DD 个单位的都可以。