1 条题解

  • 0
    @ 2025-5-28 10:20:03

    这个问题涉及生成最小的OuroborosOuroboros数,并从中提取特定位置的数值。OuroborosOuroboros数是一种特殊的二进制数,其环形排列可以生成所有可能的nn位二进制数组合。以下是对问题和解决方案的详细分析:

    问题分析

    1. Ouroboros数定义

      • 一个2n2ⁿ位的二进制数
      • 首尾相连形成环形后,每次取nn位连续比特
      • 能生成从002n12ⁿ-1的所有nn位二进制数
    2. 目标

      • 找到最小的OuroborosOuroboros
      • 实现函数o(n;k)o(n;k)返回该数环形结构中的第k个n位数值

    算法思路

    这个问题可以转化为在一个有向图中寻找欧拉回路:

    • 节点:每个n1n-1位的二进制数(共2n12ⁿ⁻¹个节点)
    • :每个节点有两条出边(0011),表示在n1n-1位后添加0011
    • 欧拉回路:遍历所有边恰好一次,形成的路径即为OuroborosOuroboros

    代码实现

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #define maxn 1<<15
    using namespace std;
    vector<int>ans;
    int cnt[maxn];
    
    void dfs(int x, int tail) {
        while(cnt[x] < 2) {
            int v = (x << 1) + cnt[x];
            cnt[x]++;
            dfs(v & tail, tail);
            ans.push_back(v);
        }
    }
    
    int main() {
        int n, m, tail;
        while(scanf("%d%d", &n, &m) && (n + m)) {
            memset(cnt, 0, sizeof(cnt));
            tail = (1 << (n - 1)) - 1;
            dfs(0, tail);
            printf("%d ", ans[ans.size() - 1 - m]);
            cout << endl;
        }
        return 0;
    }
    
    • 1

    信息

    ID
    393
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者