// @BEGIN_OF_SOURCE_CODE /* @JUDGE_ID: 17243NT 126 C++ */ // Send to judge@uva.es #include #include #include #define N 201 #define PLUS '+' #define MINUS '-' #define XVAR 'x' #define YVAR 'y' #define getnum(x) (x - '0') typedef struct { int c[100]; int x[100]; int y[100]; int n; } poly; int l; FILE *input, *output; poly inpoly[2]; int ocoef[N + 1][N + 1]; char oline[2][1000]; void writemain(int, int); void cat(int, char[]); void readinput(int); int main() { int i,j; input = stdin; output = stdout; for(;;) { l = 0; inpoly[0].n = inpoly[1].n = 0; for(i = 0; i < 100; i++) { inpoly[0].c[i] = inpoly[1].c[i] = 0; inpoly[0].x[i] = inpoly[1].x[i] = 0; inpoly[0].y[i] = inpoly[1].y[i] = 0; } for(i = 0; i < N + 1; i++) { for(j = 0; j < N + 1; j++) { ocoef[i][j] = 0; } } for(i = 0; i < 1000; i++) oline[0][i] = oline[1][i] = '\0'; readinput(0); readinput(1); for(i = 0; i < inpoly[0].n; i++) { for(j = 0; j < inpoly[1].n; j++) { ocoef[inpoly[0].x[i] + inpoly[1].x[j]][inpoly[0].y[i] + inpoly[1].y[j]] += inpoly[0].c[i] * inpoly[1].c[j]; } } for(i = N; i >= 0; i--) { for(j = 0; j <= N; j++) { if(ocoef[i][j]) writemain(i,j); } } if(strlen(oline[0]) < strlen(oline[1])) { for(i = strlen(oline[0]); i < strlen(oline[1]); i++) oline[0][i] = ' '; oline[0][i] = '\0'; } else if(strlen(oline[1]) < strlen(oline[0])) { for(i = strlen(oline[1]); i < strlen(oline[0]); i++) oline[1][i] = ' '; oline[1][i] = '\0'; } fprintf(output,"%s\n%s\n", oline[0], oline[1]); } return 0; } void writemain(int x, int y) { char temp[10]; int c = ocoef[x][y]; if(l == 0) { if(c < 0) cat(1,"-"); } else { if(c < 0) cat(1," - "); else cat(1," + "); } if(c < 0) c = -c; if(c != 1 || x + y == 0) { sprintf(temp, "%d", c); cat(1, temp); } if(x > 0) { cat(1, "x"); if(x > 1) { sprintf(temp, "%d", x); cat(0, temp); } } if (y > 0) { cat(1, "y"); if (y > 1) { sprintf(temp, "%d", y); cat(0, temp); } } } void cat(int b, char a[]) { int j, i = strlen(oline[b]), k=strlen(a); for(j = i; j < l; j++) oline[b][j] = ' '; for(j = l; j < l + k; j++) oline[b][j] = a[j - l]; l += k; } void readinput(int t) { char line[80]; char c,i,j; int counter=0, d, x, y, sign; fscanf(input, "%s", &line); if(line[0] == '#') exit(0); while((c = line[counter]) != NULL) { x=0, y=0; sign=1; if(c == MINUS) sign = -1, c = line[++counter]; if(c == PLUS) c = line[++counter]; if(c >= '0' && c <= '9') { d = getnum(c); i = line[++counter]; if(i >= '0' && i <= '9') { d = d * 10 + getnum(i); j = line[++counter]; if(j >= '0' && j <= '9') { d = d * 10 + getnum(j); counter++; } } d = d * sign; } else d = sign; while ((c = line[counter]) == 'x' || c == 'y') { if(c == 'x') { x = 1; c = line[++counter]; if(c >= '0' && c <= '9') { x = getnum(c); i = line[++counter]; if(i >= '0' && i <= '9') { x = 10 * x + getnum(i); j = line[++counter]; if(j >= '0' && j <= '9') { x = 10 * x + getnum(j); counter++; } } } } if((c = line[counter]) == 'y') { y = 1; c = line[++counter]; if(c >= '0' && c <= '9') { y = getnum(c); i = line[++counter]; if(i >= '0' && i <= '9') { y = 10 * y + getnum(i); j = line[++counter]; if(j >= '0' && j <= '9') { y=10 * y + getnum(j); counter++; } } } } } inpoly[t].c[inpoly[t].n] = d; inpoly[t].x[inpoly[t].n] = x; inpoly[t].y[inpoly[t].n] = y; inpoly[t].n++; } } // @END_OF_SOURCE_CODE