#include #include #include #include using namespace std; #define FOR(q,n) for(int q=0; q1) printf(" "); FOR(q,dim) printf("%d", curpos[perm2[q]]); } vypis_cnt++; return; } if (nadol) {b=0; a=pos[level]; } else {a=pos[level]; b=MM;} if (reverse) swap(a,b); reverse=0; // printf("range %d %d\n", a,b); int step = a>b?-1:1; int cont=1; for (int c = a; cont; c+=step) { curpos[level] = c; subsolve(level+1, reverse); reverse^=1; cont = c!=b; } // printf("eof subsolve %d %d\n", level, reverse); } void flip_pos(int level) { if (pos[level]%2) { pos[level]++; } else { pos[level]--; } } void _solve(int level,int reverse) { if (level==dim) { // printf("current starting point is "); // FOR(q,dim) printf("%d", pos[q]); // printf(", reverse is %d\n", reverse); subsolve(0, reverse); return; } if (pos[level]!=0 && pos[level]!=MM) { _solve(level+1, 0); // printf("going to flip\n"); flip_pos(level); _solve(level+1, 1); } else { _solve(level+1, 0); } } void solve() { if (dim==1) { int x = pos[0]; vector data; if (x<=4) { for (int i=x-1; i>=0; i--) data.push_back(i); FOR(i,10) if(i) data.push_back(i); } else { for (int i=x+1; i<=9; i++) data.push_back(i); for (int i=8; i>=0; i--) data.push_back(i); } printf("%u\n", data.size()); FOR(q, data.size()) { if (q) printf(" "); printf("%d", data[q]); } } else { int i = 1; FOR(q, dim) i*=10; i--; printf("%d\n", i); int cnt=0; int pos2[10]; FOR(q, dim) if (pos[q]==0) {pos2[cnt]=0; perm[cnt++]=q;} FOR(q, dim) if (pos[q]==MM) {pos2[cnt]=MM; perm[cnt++]=q;} FOR(q, dim) if (pos[q]!=MM && pos[q]!=0) {pos2[cnt]=pos[q]; perm[cnt++]=q;} FOR(q, dim) pos[q]=pos2[q]; FOR(q,dim) perm2[perm[q]]=q; // FOR(q, dim) printf("%d\n", perm[q]); _solve(0, 0); } printf("\n"); } int main() { while (init()) solve(); }