【CSP-S 2019】格雷码 - 题解
令答案为 \(g(n,k)\).
根据题意可知,\(g(1,0)=0,g(1,1)=1\).
我们可以通过递归的方式得到答案。
具体地,当 \(k<2^{n-1}\) 时,\(g(n,k)=0\sim g(n-1,k)\).
当 \(k\ge 2^{n-1}\) 时,\(g(n,k)=1\sim g(n-1,2^{n-1}-1-(k-2^{n-1}))=1\sim g(n-1,2^{n-1}-k-1+2^{n-1})\).
为什么不继续化简为 \(2^n-k-1\) 呢?因为我们注意到,对于最后 5% 的数据,当我们计算 \(2^n\) 时,会出现 \(2^{64}\)。这已经超过了 unsigned long long 的范围。所以我们通过计算两次 \(2^{n-1}\),就解决了这个问题。
(上文中,\(\sim\) 指字符串加法)
代码:
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
void solve(ull n, ull k) {
if (n == 1ull) {
cout << k;
return;
}
if (k < (1ull << n - 1)) {
cout << 0;
solve(n - 1, k);
} else {
cout << 1;
solve(n - 1, (1ull << n - 1) - k - 1 + (1ull << n - 1));
}
}
int main() {
ull n, k;
cin >> n >> k;
solve(n, k);
return 0;
}
转载是允许的,但是除了博主同意的情况下,必须在文章的明显区域说明出处,否则将会追究其法律责任。