Loading

【真题研究】CSP-S2019

[CSP-S2019] 格雷码

很简单的规律题。

考虑决策每一位的 \(0/1\),从高位往低位决策。将 \(k\) 可以看作当前的排名。

\(i\) 位若 \(2^{i-1}<k\),说明当前位为 \(0\)。否则当前位为 \(1\),并将排名更新为 \(k=2^i-k-1\) 然后继续决策即可。

时间复杂度 \(O(n)\),递归或循环实现都可。

#include<bits/stdc++.h>
#define int long long
#define For(i,l,r) for(int i=l;i<=r;++i)
#define FOR(i,r,l) for(int i=r;i>=l;--i)

using namespace std;

const int N = 65;

int n, k, ans[N];

signed main() {
  ios::sync_with_stdio(0);
  cin.tie(nullptr), cout.tie(nullptr);
  cin >> n >> k;
  FOR(i,n,1) {
    int pw = (1ll<<(i-1));
    if(k < pw) {
      ans[i] = 0;
    } else {
      ans[i] = 1;
      k = 2 * pw - k - 1;
    }
  }
  FOR(i,n,1) {
    cout << ans[i];
  }
  return 0;
}

posted @ 2024-10-24 09:41  Daniel_yzy  阅读(13)  评论(0编辑  收藏  举报