#include <bits/stdc++.h> using namespace std; constexpr int maxN = 30; int h, w; int n; long long d[maxN + 1]; long long side[maxN + 1], cost[maxN + 1]; unordered_map<long long, long long> mem; long long hash_p(pair<int, int> p) { return ((long long)p.first << 32) + p.second; } long long solve(int h_, int w_) { if(h_ > w_) { swap(h_, w_); } if(h_ == 0) { return 0; } if(mem[hash_p({h_, w_})] != 0) { return mem[hash_p({h_, w_})]; } for(int i=maxN; i>=1; i--) { if(d[i] <= h_) { long long res[2]; res[0] = solve(h_, w_ % d[i]); if(res[0] == -1) { return -1; } res[1] = solve(h_ % d[i], (w_ / d[i]) * d[i]); if(res[1] == -1) { return -1; } return mem[hash_p({h_, w_})] = ((h_ / d[i]) * (w_ / d[i]) * cost[i]) + res[0] + res[1]; } } return -1; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> h >> w; cin >> n; for(int i=1; i<=n; i++) { cin >> d[i]; side[i] = cost[i] = 1; } for(int i=n+1; i<=maxN; i++) { d[i] = (d[i - 1] << 1); side[i] = (side[i - 1] << 1); cost[i] = side[i] * side[i]; } cout << solve(h, w); }
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 | #include <bits/stdc++.h> using namespace std; constexpr int maxN = 30; int h, w; int n; long long d[maxN + 1]; long long side[maxN + 1], cost[maxN + 1]; unordered_map<long long, long long> mem; long long hash_p(pair<int, int> p) { return ((long long)p.first << 32) + p.second; } long long solve(int h_, int w_) { if(h_ > w_) { swap(h_, w_); } if(h_ == 0) { return 0; } if(mem[hash_p({h_, w_})] != 0) { return mem[hash_p({h_, w_})]; } for(int i=maxN; i>=1; i--) { if(d[i] <= h_) { long long res[2]; res[0] = solve(h_, w_ % d[i]); if(res[0] == -1) { return -1; } res[1] = solve(h_ % d[i], (w_ / d[i]) * d[i]); if(res[1] == -1) { return -1; } return mem[hash_p({h_, w_})] = ((h_ / d[i]) * (w_ / d[i]) * cost[i]) + res[0] + res[1]; } } return -1; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> h >> w; cin >> n; for(int i=1; i<=n; i++) { cin >> d[i]; side[i] = cost[i] = 1; } for(int i=n+1; i<=maxN; i++) { d[i] = (d[i - 1] << 1); side[i] = (side[i - 1] << 1); cost[i] = side[i] * side[i]; } cout << solve(h, w); } |