【解題報告】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;
}

 

 

果然還是爆棧了。。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM