#include<bits/stdc++.h> using namespace std; using LL=long long; #define FOR(i,l,r)for(int i=(l);i<=(r);++i) #define REP(i,n)FOR(i,0,(n)-1) #define ssize(x)int(x.size()) #ifdef DEBUG auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";} #define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X) #else #define debug(...){} #endif int main() { cin.tie(0)->sync_with_stdio(0); int h, w; cin >> h >> w; int n; cin >> n; vector<int> t(n); REP (i, n) cin >> t[i]; sort(t.rbegin(), t.rend()); function<LL(int, int, int)> rek = [&](int a, int b, int p) { if (p == n) return 0ll; if (a < t[p] || b < t[p]) return rek(a, b, p + 1); LL ca = a / t[p]; LL cb = b / t[p]; int na = a % t[p]; int nb = b % t[p]; return ca * cb + rek(na, b, p + 1) + rek(a - na, nb, p + 1); }; if (w % t.back() || h % t.back()) { cout << -1 << endl; return 0; } cout << rek(w, h, 0) << endl; }
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 | #include<bits/stdc++.h> using namespace std; using LL=long long; #define FOR(i,l,r)for(int i=(l);i<=(r);++i) #define REP(i,n)FOR(i,0,(n)-1) #define ssize(x)int(x.size()) #ifdef DEBUG auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";} #define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X) #else #define debug(...){} #endif int main() { cin.tie(0)->sync_with_stdio(0); int h, w; cin >> h >> w; int n; cin >> n; vector<int> t(n); REP (i, n) cin >> t[i]; sort(t.rbegin(), t.rend()); function<LL(int, int, int)> rek = [&](int a, int b, int p) { if (p == n) return 0ll; if (a < t[p] || b < t[p]) return rek(a, b, p + 1); LL ca = a / t[p]; LL cb = b / t[p]; int na = a % t[p]; int nb = b % t[p]; return ca * cb + rek(na, b, p + 1) + rek(a - na, nb, p + 1); }; if (w % t.back() || h % t.back()) { cout << -1 << endl; return 0; } cout << rek(w, h, 0) << endl; } |