#include <iostream> #include <vector> #include <map> using namespace std; struct Rectange { int w, h; }; long long resolve(long long c, map<long long, long long > & dp, const vector<long long>& d, int i) { long long w = c % 2000000000LL, h = c / 2000000000LL; if (w > h) { long long temp = h; h = w; w = temp; c = h * 2000000000 + w; } if (dp.find(c) != dp.end()) { return dp[c]; } long long w1 = w / d[i], w2 = w % d[i], h1 = h / d[i], h2 = h % d[i]; long long result = w1 * h1; if (h2 > 0) { long long ncase = h2 * 2000000000 + w; result += resolve(ncase, dp, d, i - 1); } if (w2 > 0 && h1 > 0) { long long ncase = h1 * d[i] * 2000000000 + w2; result += resolve(ncase, dp, d, i - 1); } dp[c] = result; return result; } int main() { long long h, w, n; cin >> h >> w >> n; vector<long long> d; d.reserve(n); for (int i = 0; i < n; i++) { long long di; cin >> di; d.push_back(di); } if (w % d[0] != 0 || h % d[0] != 0) { cout << -1; } else { map<long long, long long> dp; cout << resolve(w * 2000000000 + h, dp, d, d.size() - 1); } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | #include <iostream> #include <vector> #include <map> using namespace std; struct Rectange { int w, h; }; long long resolve(long long c, map<long long, long long > & dp, const vector<long long>& d, int i) { long long w = c % 2000000000LL, h = c / 2000000000LL; if (w > h) { long long temp = h; h = w; w = temp; c = h * 2000000000 + w; } if (dp.find(c) != dp.end()) { return dp[c]; } long long w1 = w / d[i], w2 = w % d[i], h1 = h / d[i], h2 = h % d[i]; long long result = w1 * h1; if (h2 > 0) { long long ncase = h2 * 2000000000 + w; result += resolve(ncase, dp, d, i - 1); } if (w2 > 0 && h1 > 0) { long long ncase = h1 * d[i] * 2000000000 + w2; result += resolve(ncase, dp, d, i - 1); } dp[c] = result; return result; } int main() { long long h, w, n; cin >> h >> w >> n; vector<long long> d; d.reserve(n); for (int i = 0; i < n; i++) { long long di; cin >> di; d.push_back(di); } if (w % d[0] != 0 || h % d[0] != 0) { cout << -1; } else { map<long long, long long> dp; cout << resolve(w * 2000000000 + h, dp, d, d.size() - 1); } return 0; } |