BZOJ-3033 太鼓达人
欧拉回路。
把每个数当作一个节点,能首尾相连的就连接一条有向边。
然后从起点跑一遍就行。
#include <cstdio> #include <algorithm> #include <iostream> #include <cctype> #include <queue> #include <cstring> using namespace std; #define rep(i, l, r) for(int i=l; i<=r; i++) #define down(i, l, r) for(int i=l; i>=r; i--) #define travel(x) for(edge *p=fir[x]; p; p=p->n) #define maxn 12345 #define maxm 123456 #define inf 0x7fffffff #define clr(x, c) memset(x, c, sizeof(x)) inline int read() { int x=0; char ch=getchar(); while (!isdigit(ch)) ch=getchar(); while (isdigit(ch)) { x=x*10+ch-'0'; ch=getchar(); } return x; } int n=read(), m=1, top, s[maxn]; bool b[maxn]; bool dfs(int x) { s[++top]=x; b[x]=1; if (top==m) return true; if (!b[(x*2)%m] && dfs((x*2)%m)) return true; if (!b[(x*2)%m+1] && dfs((x*2)%m+1)) return true; --top; b[x]=0; return false; } int main() { rep(i, 1, n) m*=2; printf("%d ", m); dfs(0); m/=2; rep(i, 1, top) printf("%d", s[i]/m); }