题意: 中文题面,相信你看到的,不再赘述。
题解: 今天做到的欧拉回路构造第三次了,可参考POJ1780 Code——欧拉回路(非递归DFS)。
过程中犯的错:
- mod: 每次循环pre都要更新,而pre的更新运算又与mod相关,mod的大小应为2k-2。
- pre: pre的更新一直弄错,
pre = (pre % mod) * 2 + deg[pre] - 1;
这个不解释可能过几天我自己也忘记了。意为剪去pre的第一位数字(即pre % mod
)之后加上末尾新的数字,十位数肯定是处理不了的,因为每一位只能是1或0,当成二进制转换成十进制算最大也才1024,因而 * 2。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
int k;
void solve(int n){
int mod = 1, ans[N], deg[N] = {0};
for(int i = 0; i < n; i++) ans[i] = 0, mod *= 2;
int pre = 0, len = n; mod /= 2;
while(deg[pre] < 2){
deg[pre]++;
if(deg[(pre % mod) * 2 + deg[pre] - 1] == 2) continue;
ans[len++] = deg[pre] - 1;
pre = (pre % mod) * 2 + deg[pre] - 1;
}
printf("%d ", len + 1);
for(int i = 0; i < len; i++) printf("%d", ans[i]); printf("1\n");
}
int main(){
while(~scanf("%d", &k)) solve(k - 1);
return 0;
}