【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;
}
posted @ 2020-10-17 00:07  Aehnuwx  阅读(133)  评论(0编辑  收藏  举报