洛谷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} 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;
}
原文地址:https://www.cnblogs.com/quanjun/p/13123989.html