#include <cstdio>
#include <algorithm>
#include <cstdlib>
FILE *fin = fopen("ecuatie.in", "r"), *fout = fopen("ecuatie.out", "w");
#define MAXN 10000
struct myc {
int x, y;
inline bool operator < (const myc &u) const {
if (x != u.x) return x < u.x;
else return y < u.y;
}
} v[MAXN], u[MAXN];
inline void divizori(int a, int &n, myc v[]) {
int x = a;
if (a < 0)
x = -a;
n = 0;
for (int i = 1; i * i <= x; i++) {
if (x % i == 0) {
if (i * i == x) {
v[n++] = {i, a / i};
v[n++] = {-i, -a / i};
} else {
v[n++] = {i, a / i};
v[n++] = {-i, -a / i};
v[n++] = {a / i, i};
v[n++] = {-a / i, -i};
}
}
}
std::sort(v, v + n);
}
inline void afis(int p, int q) {
fputc('(', fout);
if (p == -1)
fputc('-', fout);
else if (p != 1)
fprintf(fout, "%d", p);
fputc('x', fout);
if (q > 0)
fputc('+', fout);
fprintf(fout, "%d)", q);
}
inline void nou(int &k, int i, int j) {
k--;
if (k)
return ;
afis(v[i].x, u[j].x);
afis(v[i].y, u[j].y);
exit(0);
}
int main() {
int a, b, c, k, n, m;
fscanf(fin, "%d%d%d%d", &a, &b, &c, &k);
divizori(a, n, v);
divizori(c, m, u);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (v[i].x * u[j].y + v[i].y * u[j].x == b)
nou(k, i, j);
fprintf(fout, "-1");
fclose(fin);
fclose(fout);
return 0;
}