1 条题解
-
0
这个问题涉及生成最小的数,并从中提取特定位置的数值。数是一种特殊的二进制数,其环形排列可以生成所有可能的位二进制数组合。以下是对问题和解决方案的详细分析:
问题分析
-
Ouroboros数定义:
- 一个位的二进制数
- 首尾相连形成环形后,每次取位连续比特
- 能生成从到的所有位二进制数
-
目标:
- 找到最小的数
- 实现函数返回该数环形结构中的第k个n位数值
算法思路
这个问题可以转化为在一个有向图中寻找欧拉回路:
- 节点:每个位的二进制数(共个节点)
- 边:每个节点有两条出边(和),表示在位后添加或
- 欧拉回路:遍历所有边恰好一次,形成的路径即为数
代码实现
#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
- 上传者