[CSP-S2019] 格雷码
很简单的规律题。
考虑决策每一位的 \(0/1\),从高位往低位决策。将 \(k\) 可以看作当前的排名。
第 \(i\) 位若 \(2^{i-1}<k\),说明当前位为 \(0\)。否则当前位为 \(1\),并将排名更新为 \(k=2^i-k-1\) 然后继续决策即可。
时间复杂度 \(O(n)\),递归或循环实现都可。
#include<bits/stdc++.h>
#define int long long
#define For(i,l,r) for(int i=l;i<=r;++i)
#define FOR(i,r,l) for(int i=r;i>=l;--i)
using namespace std;
const int N = 65;
int n, k, ans[N];
signed main() {
ios::sync_with_stdio(0);
cin.tie(nullptr), cout.tie(nullptr);
cin >> n >> k;
FOR(i,n,1) {
int pw = (1ll<<(i-1));
if(k < pw) {
ans[i] = 0;
} else {
ans[i] = 1;
k = 2 * pw - k - 1;
}
}
FOR(i,n,1) {
cout << ans[i];
}
return 0;
}