洛谷P5657 格雷码 题解(CSP-S2019 D1T1) 模拟
题目链接: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} \rfloor\) 模 \(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;
}