要a+c=2b时b不在ac之间
a c 是两个连续偶数(例如0 2),那b就是个奇数(1),就把ac放在一边,b放在另一边。a c是奇数反之亦然。
递归地,分开后对(奇数-1)/2,偶数/2,可化归。
#include<bits/stdc++.h>
#ifdef LOCAL
FILE* FP = freopen("text.in", "r", stdin);
#endif
using namespace std;
void dfs(int n,int bei,int bia){
if(n==1){
printf(" %d",bia);
}else{//偶前
dfs((n+1)/2,bei*2,bia);
dfs(n/2,bei*2,bia+bei);
}
}
signed main() {
int n;
while(scanf("%d",&n),n){
//3: 0 2 1
printf("%d:",n);
dfs(n,1,0);
printf("\n");
}
return 0;
}