格雷码 CSP(NOIP??)2019 洛谷 P5657
多年过后,重新来看这道D1T1,20min不到AC,再回忆起当初考场三小时的抓耳挠腮,不禁感慨万千啊!!
发篇题解记录一下。
思路:直接dfs模拟即可(二进制找规律是不可能的, 这辈子也不会去找规律)。
#include <bits/stdc++.h> using namespace std; #define ll unsigned long long inline ll pow(ll x){ ll a = 1, temp = 2; for(int i = 1;i <= x; i++){ a *= temp; } return a; } ll a[100], cnt = 0; void dfs(ll n, ll k){ if(n == 1){ if(k == 1) a[++cnt] = 1; else a[++cnt] = 0; return ; } if(k >= (pow(n) / 2) ) dfs(n - 1, (pow(n) - k - 1)); else dfs(n - 1, k); if(k >= pow(n) / 2) a[++cnt] = 1; else a[++cnt] = 0; return ; } int main(){ // freopen("hh.txt", "r", stdin); ll n, k; cin >> n >> k; dfs(n, k); for(int i = cnt;i > 0; i--) printf("%d", a[i]); return 0; }