【CSP2019】格雷码
模拟
题目大意:
求 $n$ 位格雷码中第 $k$ 个。
题解:
按题意一位一位确定即可。
发现去掉一位以后,前一半反一下就是后一半,所以直接递归即可。
时间复杂度 $O(n)$。
注意 $2^{64}-1$ 要unsigned long long
,然后输入要用llu
,左移的时候要1uLL<<(n-1)
等否则会挂。
Code:
#include<cstdio>
using namespace std;
typedef unsigned long long LL;
int n;LL k;
LL solve(int n,LL k){
if(n==0)return k;
const LL mid=1uLL<<n;
if(k<mid)return solve(n-1,k);else
return 1uLL<<n|solve(n-1,mid*2-k-1);
}
int main(){
scanf("%d%llu",&n,&k);
LL ans=solve(n-1,k);
for(int i=n-1;~i;--i)
printf("%lld",ans>>i&1);
printf("\n");
return 0;
}
事实上是有更好的解法的。
发现答案为k^(k>>1)
。
所以就有一份 $56\rm B$ 的代码(by yhx)……
n,k=map(int,input().split());print(bin(1<<n|k^k>>1)[3:])