/* Sun Mar 21 01:46:27 JST 2004 */ #include #include #include #define max(x,y) (((x)>(y))?(x):(y)) int half(char *s) { int i, j, len, q = 0; len = strlen(s); for (i = 0; i < len; i++) { s[i+1] += ((s[i]-'0')%2)*10; s[i ] = '0'+(s[i]-'0')/2; } if (s[0] == '0') { for (i = 0; i < len; i++) { s[i] = s[i+1]; } len--; } if (s[len] > 0) { s[len] = '\0'; return 1; } return 0; } void dbl(char *s) { int i, len; len = strlen(s); for (i = len-1; i >= 0; i--) { s[i] = '0'+((s[i]-'0')*2); } for (i = len-1; i >= 1; i--) { if (s[i] > '9') { s[i-1]++; s[i] = '0'+((s[i]-'0')%10); } } if (s[0] > '9') { for (i = len; i >= 0; i--) { s[i+1] = s[i]; } len++; s[0] = '0'+((s[1]-'0')/10); s[1] = '0'+((s[1]-'0')%10); } } void inc(char *s) { int i, len; len = strlen(s); s[len-1]++; for (i = len-1; i >= 1; i--) { if (s[i] > '9') { s[i] = '0'; s[i-1]++; } } if (s[0] > '9') { for (i = len; i >= 0; i--) { s[i+1] = s[i]; } len++; s[0] = '0'+((s[1]-'0')/10); s[1] = '0'+((s[1]-'0')%10); } } void swap(char *x, char *y) { char t; t = *x; *x = *y; *y = t; } void reverse(char *s) { int i, len; len = strlen(s); for (i = 0; i < len/2; i++) { swap(&s[i], &s[len-i-1]); } } void bit(char *s, char d[4096]) { int i; d[0] = '\0'; for (i = 0; s[0] != '\0'; i++) { d[i] = (half(s) ? '1' : '0'); d[i+1] = '\0'; } } void encode(char *s, char d[1024]) { int i, len; len = strlen(s); strcpy(d, "0"); for (i = 0; i < len; i++) { dbl(d); if (s[i] == '1') { inc(d); } } } void fill(char s[4096], int last) { int i, len; len = strlen(s); for (i = len; i < last; i++) { s[i] = '0'; } s[last] = '\0'; } char turn(char c) { return '0'+(1-(c-'0')); } int cmp(char x[1024], char y[1024]) { int i, xlen, ylen, len; xlen = strlen(x); ylen = strlen(y); if (xlen < ylen) { return -1; } if (xlen > ylen) { return +1; } len = xlen = ylen; for (i = 0; i < len; i++) { if (x[i] < y[i]) { return -1; } if (x[i] > y[i]) { return +1; } } return 0; } unsigned int change(char x[4096], char y[4096], int f, char t[4096]) { int i, len; unsigned int count = 0; char s[4096]; strcpy(s, x); len = strlen(x); t[len] = '\0'; if (f) { s[0] = turn(s[0]); s[1] = turn(s[1]); t[0] = '1'; count++; } else { t[0] = '0'; } for (i = 1; i < len; i++) { if (s[i-1] != y[i-1]) { s[i-1] = turn(s[i-1]); s[i ] = turn(s[i ]); if (i+1 < len) { s[i+1] = turn(s[i+1]); } t[i] = '1'; count++; } else { t[i] = '0'; } } if (s[len-1] != y[len-1]) { return UINT_MAX; } return count; } int main() { char s[1024], *p, *q; char x[4096], y[4096], xlen, ylen, len; char a[4096], b[4096]; char f[1024], g[1024]; unsigned int m, n; int icase, result; for (icase = 1; ; icase++) { gets(s); p = strtok(s, " "); q = strtok(NULL, " "); if (strcmp(p, "0") == 0 && strcmp(q, "0") == 0) { break; } bit(p, x); xlen = strlen(x); bit(q, y); ylen = strlen(y); len = max(xlen, ylen); fill(x, len); fill(y, len); reverse(x); reverse(y); m = change(x, y, 0, a); encode(a, f); n = change(x, y, 1, b); encode(b, g); if (icase > 1) { printf("\n"); } printf("Case Number %d: ", icase); if (m == UINT_MAX && n == UINT_MAX) { printf("impossible\n"); } else if (m < n) { printf("%s\n", f); } else if (m > n) { printf("%s\n", g); } else if (cmp(f, g) < 0) { printf("%s\n", f); } else { printf("%s\n", g); } } return 0; }