#include <cstdio> #include <cstring> #include <cassert> #include <algorithm> #include <vector> #include <map> #include <queue> using namespace std; struct Pair { public: int x, y; Pair(int xx, int yy) { x=min(xx,yy); y=max(xx,yy); } }; queue<Pair> q; int n; int h,w; vector<int> d; void print_vector(vector<int> v) { for (auto e : v) { printf(" %d", e); } printf("\n"); } /* search for element i in vector d such as d[i] <= k and d[i+1] not exists or d[i+1] > k */ int bin_search(int k) { int pos; int a = 0; int b = n-1; while (a <= b) { pos = (a+b+1)/2; if (d[pos] == k) { return pos; } if (d[pos] > k) { b = pos-1; continue; } if (a == b) { return a; } a=pos; } assert(1==0); } unsigned long long calc_res() { unsigned long long res = 0; q.push( Pair(h,w) ); while(!q.empty()) { Pair p = q.front(); int i, dd, k, l; q.pop(); i = bin_search( p.x ); dd = d[i]; k = p.y/dd; l = p.x/dd; // printf("x=%d, y=%d, d=%d\n", p.x, p.y, dd); if (p.x-l*dd > 0) { // printf("put %d %d\n", p.x-dd, dd); q.push( Pair(p.x-l*dd, dd*k) ); } if (p.y-dd*k > 0) { // printf("put %d %d\n", dd, p.y-dd); q.push( Pair( p.x, p.y-dd*k) ); } // if (p.x-dd>0 && p.y-dd>0) { // printf("put %d %d\n", p.x-dd, p.y-dd); // q.push( Pair(p.x-dd, p.y-dd) ); // } res += ((unsigned long long) k) * ((unsigned long long) l); } return res; } int main() { scanf("%d %d\n", &h, &w); scanf("%d\n", &n); for(int i = 0; i < n; ++i) { int dd; scanf("%d", &dd); d.push_back(dd); } if (h % d[0] != 0 || w % d[0] != 0) { printf("-1\n"); return 0; } printf("%llu\n", calc_res()); 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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | #include <cstdio> #include <cstring> #include <cassert> #include <algorithm> #include <vector> #include <map> #include <queue> using namespace std; struct Pair { public: int x, y; Pair(int xx, int yy) { x=min(xx,yy); y=max(xx,yy); } }; queue<Pair> q; int n; int h,w; vector<int> d; void print_vector(vector<int> v) { for (auto e : v) { printf(" %d", e); } printf("\n"); } /* search for element i in vector d such as d[i] <= k and d[i+1] not exists or d[i+1] > k */ int bin_search(int k) { int pos; int a = 0; int b = n-1; while (a <= b) { pos = (a+b+1)/2; if (d[pos] == k) { return pos; } if (d[pos] > k) { b = pos-1; continue; } if (a == b) { return a; } a=pos; } assert(1==0); } unsigned long long calc_res() { unsigned long long res = 0; q.push( Pair(h,w) ); while(!q.empty()) { Pair p = q.front(); int i, dd, k, l; q.pop(); i = bin_search( p.x ); dd = d[i]; k = p.y/dd; l = p.x/dd; // printf("x=%d, y=%d, d=%d\n", p.x, p.y, dd); if (p.x-l*dd > 0) { // printf("put %d %d\n", p.x-dd, dd); q.push( Pair(p.x-l*dd, dd*k) ); } if (p.y-dd*k > 0) { // printf("put %d %d\n", dd, p.y-dd); q.push( Pair( p.x, p.y-dd*k) ); } // if (p.x-dd>0 && p.y-dd>0) { // printf("put %d %d\n", p.x-dd, p.y-dd); // q.push( Pair(p.x-dd, p.y-dd) ); // } res += ((unsigned long long) k) * ((unsigned long long) l); } return res; } int main() { scanf("%d %d\n", &h, &w); scanf("%d\n", &n); for(int i = 0; i < n; ++i) { int dd; scanf("%d", &dd); d.push_back(dd); } if (h % d[0] != 0 || w % d[0] != 0) { printf("-1\n"); return 0; } printf("%llu\n", calc_res()); return 0; } |