令答案为 (g(n,k)).
根据题意可知,(g(1,0)=0,g(1,1)=1).
我们可以通过递归的方式得到答案。
具体地,当 (k<2^{n-1}) 时,(g(n,k)=0sim g(n-1,k)).
当 (kge 2^{n-1}) 时,(g(n,k)=1sim g(n-1,2^{n-1}-1-(k-2^{n-1}))=1sim 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;
}