题目链接:https://www.luogu.org/problem/P5657
话说这道题怎么是道橙题啊。
基本思路

- 因为n位格雷码的前2n-1位就是n-1位格雷码前面加了一位‘0’,所以可以把它们近似的看作和n-1位格雷码相同
- 寻找第k位格雷码是通过哪一个格雷码得出的,以4位格雷码为例,因为第10号格雷码是由5号的前面加了“1”得到的,所以10号与5号对应
- 如果k小于2n-1,即最高位为0,它与本身对应
- 按上述方法求出在n-1位格雷码中刚才算出的对应编号的值,然后在前面加上“0”或“1”
- 因为数据范围位264,所以要用 unsigned long long 。
代码:
#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;
int n, n1, n2, shuzu[10086];
ull k;
ull mypow(int a, int b){
ull ans=1;
for(int i=0; i<b; i++) ans*=a;
return ans;
}
void digui(ull x){
if(x==0){
shuzu[0]=0;
return;
}
else if(x==1){
shuzu[0]=1;
return;
}
else{
if(x>=n1/2){
n--;
n1/=2;
shuzu[n]=1;
digui(mypow(2, n+1)-x-1);
}
else{
n--;
n1/=2;
shuzu[n]=0;
digui(x);
}
}
}
int main(){
scanf("%d %llu", &n, &k);
n2=n;
n1=mypow(2, n);
digui(k);
for(int i=n2-1; i>=0; i--){
printf("%d", shuzu[i]);
}
return 0;
}
果然还是爆栈了。。
