题目链接: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; }
果然还是爆栈了。。