#include using namespace std; const int MAXM = 400; int largest[21][21][MAXM + 1]; int get_largest(int w, int h, int m) { if (w > h) return largest[h][w][m]; else return largest[w][h][m]; } int set_largest(int w, int h, int m, int value) { if (w > h) largest[h][w][m] = value; else largest[w][h][m] = value; } void fill_largest() { for (int m = 1; m <= MAXM; ++m) for (int w = 1; w <= 20; ++w) for (int h = 1; h <= w; ++h) { if (m == 1) { set_largest(w, h, m, w * h); continue; } int smallest = INT_MAX; for (int x = 1; x <= ((w + 1) / 2); ++x) if ((w - x) >= 1) { for (int mm = 1; mm < m; ++mm) if (get_largest(x, h, mm) && get_largest(w - x, h, m - mm)) smallest = min(smallest, max(get_largest(x, h, mm), get_largest(w - x, h, m - mm))); } for (int y = 1; y <= ((h + 1) / 2); ++y) if ((h - y) >= 1) { for (int mm = 1; mm < m; ++mm) if (get_largest(w, y, mm) && get_largest(w, h - y, m - mm)) smallest = min(smallest, max(get_largest(w, y, mm), get_largest(w, h - y, m - mm))); } if ((smallest == INT_MIN) || (smallest == INT_MAX)) set_largest(w, h, m, 0); else set_largest(w, h, m, smallest); } } int main() { fill_largest(); #if 0 for (int m = 1; m <= 4; ++m) { for (int h = 1; h <= 4; ++h) { for (int w = 1; w <= 4; ++w) cout << get_largest(w, h, m) << " "; cout << endl; } cout << endl; } #endif while (true) { int w, h, m; cin >> w; cin >> h; cin >> m; if ((w == 0) && (h == 0) && (m == 0)) break; cout << get_largest(w, h, m) << endl; } return 0; }