題目鏈接: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; }
果然還是爆棧了。。

