【解题报告】CSP2019-S D1T1 格雷码

题目链接:https://www.luogu.org/problem/P5657

话说这道题怎么是道橙题啊。

基本思路

 

  1. 因为n位格雷码的前2n-1位就是n-1位格雷码前面加了一位‘0’,所以可以把它们近似的看作和n-1位格雷码相同
  2. 寻找第k位格雷码是通过哪一个格雷码得出的,以4位格雷码为例,因为第10号格雷码是由5号的前面加了“1”得到的,所以10号与5号对应  
  3. 如果k小于2n-1,即最高位为0,它与本身对应
  4. 按上述方法求出在n-1位格雷码中刚才算出的对应编号的值,然后在前面加上“0”或“1”
  5. 因为数据范围位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;
}

 

 

果然还是爆栈了。。

 

 

 

 

 

posted @ 2019-11-16 18:47  TFLS-DJL  阅读(635)  评论(0编辑  收藏  举报