洛谷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;
}
posted @ 2020-06-14 10:39  quanjun  阅读(388)  评论(0编辑  收藏  举报