1 条题解

  • 0
    @ 2026-10-18 21:19:19

    [CSP-S 2019] 格雷码

    知识点

    二进制、位运算、格雷码

    解题思路

    本题反射二进制格雷码的第k项等于k xor (k右移1位)。使用unsigned long long保存k和结果,随后从第n-1位到第0位输出每一位。逐位输出能保留前导零,也避免构造2^64造成溢出。

    正确性说明

    设k的二进制位为b_i,最高位之外补0。公式得到的第i位为b_(i+1) xor b_i。最高位把序列分为前半段0前缀与后半段1前缀;在后半段去掉最高位后,低位的异或值恰等于将编号反射后的低n-1位格雷码。因此该公式满足题目递归构造的初始情形和两半反射规则,归纳可知它正是题目指定的排列。

    易错点

    k可达到2^64-1,不能用有符号long long;不能计算1ULL<<64;逐位循环的最大位移是63;必须恰好输出n位并保留前导零。

    复杂度

    时间O(n),额外空间O(1),直接逐位输出。

    参考代码(GNU C++17)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        ios::sync_with_stdio(false); cin.tie(nullptr);
        int n;unsigned long long k;cin>>n>>k;
        unsigned long long g=k^(k>>1);
        for(int i=n-1;i>=0;--i) cout<<((g>>i)&1ULL);
        cout<<'\n';
        return 0;
    }
    
    • 1

    信息

    ID
    829
    时间
    1000ms
    内存
    256MiB
    难度
    普及−
    标签
    递交数
    0
    已通过
    0
    上传者