题目链接:https://www.luogu.com.cn/problem/P5657
解题思路:
我们假设一个 (n) 位格雷码最高位到最低位依次为第 (n-1 sim 0) 位,则我们可以发现:
对于第 (i) 位,是以 (2^{i+2}) 为一个周期的,一个周期内依次是 (2^i) 个 (0),(2^{i+1}) 个 (1),(2^i) 个 (0)。
举个例子:
当 (n=3) 时,对应的格雷码是 000,001,011,010,110,111,101,100。
- 第 (2) 位依次是:00001111
- 第 (1) 位依次是:00111100
- 第 (0) 位一次是:01100110
如果将 (n) 扩大到 (4) 不难发现:
- 第 (3) 位依次是:0000000011111111
- 第 (2) 位依次是:0000111111110000
- 第 (1) 位依次是:0011110000111100
- 第 (0) 位依次是:0110011001100110
所以,对于第 (i) 位来说,我们只需要判断值 (lfloor frac{k}{2^i} floor) 模 (4) 的结果为多少,如果为 (1) 或 (2) ,则该位上的值为 (1) ,否则为 (0)。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
unsigned long long k;
int n;
int main() {
cin >> n >> k;
for (int i = n-1; i >= 0; i --) {
unsigned long long tmp = k >> i;
putchar( tmp%4==1 || tmp%4==2 ? '1' : '0' );
}
return 0;
}