P5657 格雷码

思路

考场上的递归思路

每次向下递归的时候判断是左半边还是右半边即可
注意向右半边递归之后下一层序列要反转过来即可

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
void solve(unsigned long long n,unsigned long long k,unsigned long long rev=0){
    if(rev)
        k=((1ULL<<(n))-1)-k;
    // cout<<n<<' '<<k<<' '<<rev<<endl<<endl;
    if(n==1){
        if(k==0)
            printf("0");
        else
            printf("1");
        return;
    }    
    if(k>((1ULL<<(n-1))-1)){
        printf("1");
        solve(n-1,k-((1ULL<<(n-1))),1);
    }
    else{
        printf("0");
        solve(n-1,k,0);
    }
}
unsigned long long n,k;
int main(){
    cin>>n>>k;
    solve(n,k);
    return 0;
}
posted @ 2019-11-16 21:04  dreagonm  阅读(322)  评论(0编辑  收藏  举报