极简题解|格雷码
2025-04-02 21:26:55
发布于:江苏
8阅读
0回复
0点赞
总共2n位组成的格雷码,前n位正序依次继承并在首位加0,后n位逆序继承并在首位加1,所以从当前k的值求出继承的编号。如2位编号3就可以通过观察发现继承的应该是1位编号0[2(父位格雷码总数)-(3(编号)+1(+1求序数)-2(子位格雷码半数))]
以a代表父位格雷码总数或子位格雷码半数
化简即2*a-k-1
!!!一定要开ull,要不会WA很多!!!
#include<cstdio>
using namespace std;
#define ull unsigned long long//敲重点
ull n,k;
void f(ull n,ull k){
if(n==1){
if(k){
printf("1");
return;
}else{
printf("0");
return;
}
}
//a代表子位半数或父位格雷码总数
ull a=(1ull)<<(n-1);
if(k>=a){//k大于半数
printf("1");//首位为1
f(n-1,(a<<1)-k-1);//代入公式
}else{
printf("0");
f(n-1,k);//不过半,照搬
}
}
int main(){
scanf("%llu %llu",&n,&k);//这个快
f(n,k);
return 0;
}
这里空空如也
有帮助,赞一个