#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#if DEBUG
#define LOG(...) printf(__VA_ARGS__)
#define DOUT cout
#else
#define LOG(...)
#define DOUT if(0) cout
#endif
vector<pair<int, int>> cover(
pair<int, int> hw,
const vector<int> &d,
ll &used
) {
int h = hw.first;
int w = hw.second;
int dx = d.size() - 1;
while (d[dx] > h || d[dx] > w)
dx--;
int left_h = h % d[dx];
int left_w = w % d[dx];
ll h_used = h / d[dx];
ll w_used = w / d[dx];
ll used_now = h_used * w_used;
used += used_now;
LOG("covering %d %d with %d times %lld\n", h, w, d[dx], used_now);
vector<pair<int, int>> areas_left;
if (left_w > 0)
areas_left.emplace_back(d[dx] * h_used, left_w);
if (left_h > 0)
areas_left.emplace_back(left_h, d[dx] * w_used);
if (left_h > 0 && left_w > 0)
areas_left.emplace_back(left_h, left_w);
return areas_left;
}
int main() {
int h, w;
scanf("%d%d", &h, &w);
int n;
scanf("%d", &n);
vector<int> d(n);
for (int i = 0; i < n; i++)
scanf("%d", &d[i]);
for (int i = 0; i < n; i++)
LOG("%d ", d[i]);
LOG("\n");
if (w % d[0] != 0 || h % d[0] != 0) {
printf("-1\n");
return 0;
}
ll result = 0;
queue<pair<int, int>> q;
q.emplace(h, w);
while (!q.empty()) {
auto c = q.front();
q.pop();
auto areas = cover(c, d, result);
for (auto a : areas) {
q.push(a);
}
}
printf("%lld\n", result);
}
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 | #include <bits/stdc++.h> using namespace std; typedef long long ll; #if DEBUG #define LOG(...) printf(__VA_ARGS__) #define DOUT cout #else #define LOG(...) #define DOUT if(0) cout #endif vector<pair<int, int>> cover( pair<int, int> hw, const vector<int> &d, ll &used ) { int h = hw.first; int w = hw.second; int dx = d.size() - 1; while (d[dx] > h || d[dx] > w) dx--; int left_h = h % d[dx]; int left_w = w % d[dx]; ll h_used = h / d[dx]; ll w_used = w / d[dx]; ll used_now = h_used * w_used; used += used_now; LOG("covering %d %d with %d times %lld\n", h, w, d[dx], used_now); vector<pair<int, int>> areas_left; if (left_w > 0) areas_left.emplace_back(d[dx] * h_used, left_w); if (left_h > 0) areas_left.emplace_back(left_h, d[dx] * w_used); if (left_h > 0 && left_w > 0) areas_left.emplace_back(left_h, left_w); return areas_left; } int main() { int h, w; scanf("%d%d", &h, &w); int n; scanf("%d", &n); vector<int> d(n); for (int i = 0; i < n; i++) scanf("%d", &d[i]); for (int i = 0; i < n; i++) LOG("%d ", d[i]); LOG("\n"); if (w % d[0] != 0 || h % d[0] != 0) { printf("-1\n"); return 0; } ll result = 0; queue<pair<int, int>> q; q.emplace(h, w); while (!q.empty()) { auto c = q.front(); q.pop(); auto areas = cover(c, d, result); for (auto a : areas) { q.push(a); } } printf("%lld\n", result); } |
English