求長度為 10ⁿ + n - 1 的數字序列,使其包含所有 n 位數 (0~10ⁿ-1) 作為連續子串恰好一次。n ≤ 6。
10^{n-1} 個)。10ⁿ 條邊,每條對應一個 n 位數。stk[0..top-1],取每個節點的最高位 (stk[i] / mod) 連接。#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 1000015;
struct Edge { int v, next; } e[maxn];
int n, mod, head[maxn], stk[maxn];
int idx, edge, top;
char vis[maxn];
void insert(int a, int b) { e[idx] = {b, head[a]}; head[a] = idx++; }
void dfs() {
stk[top++] = 0;
while (true) {
int v = stk[top-1];
if (top >= idx - (n-2)) return; // 邊已用完
bool flag = false;
for (int i = head[v]; i != -1; i = e[i].next)
if (!vis[i]) { vis[i] = 1; stk[top++] = e[i].v; flag = true; break; }
if (!flag) --top;
}
}
int main() {
while (scanf("%d", &n) == 1 && n) {
if (n == 1) { puts("0123456789"); continue; }
idx = top = 0;
memset(head, -1, sizeof(head));
memset(vis, 0, sizeof(vis));
int lim = 1; for (int i=1; i= 0; j--)
insert(i, (i%mod)*10 + j);
dfs();
for (int i = 0; i < top-1; i++) printf("%d", stk[i]/mod);
printf("%d", stk[top-1]);
for (int i = 1; i < n; i++) printf("0");
puts("");
}
return 0;
}
本題是德布魯因序列構造的經典應用,展示了如何將字符串覆蓋問題轉化為圖的歐拉迴路問題並高效求解。