1152. 格雷码

几个对爆LL,ULL的处理
长度为n的格雷码的编码范围为\([0, 2^n - 1]\), 它的中间点是长度为n - 1的格雷码的最后一个编码的编号\(2^{n - 1} - 1\)

#include<iostream>
#include<bitset>

using namespace std;

#define ULL unsigned long long

int n;
ULL k;

string dfs(int n, ULL k){
    if(n == 1) return k ? "1" : "0";
    ULL mid = ((ULL) 1 << n - 1) - 1;
    
    if(k > mid){
        ULL p = k - mid;
        return "1" + dfs(n - 1, mid + 1 - p);
    }else 
        return "0" + dfs(n - 1, k);
}

int main(){
    cin >> n >> k;
    
    cout << dfs(n, k);
    
    // for(int i = n - 1; i >= 0; i --) cout << ((res >> i) & 1);
}
posted @ 2020-09-30 20:13  yys_c  阅读(105)  评论(0编辑  收藏  举报