// #include <bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main()
{
    FAST
    uint64_t n,m, dn;
    cin >> n >> m >> dn;
    vector<uint64_t> d(dn);
    for (int i = 0; i < dn; i++)
    {
        cin >> d[i];
    }
    if (n%d[0] != 0 || m %d[0] != 0 ) {
        cout << -1;
        return 0;
    }
    uint64_t fit_n, fit_m;
    pair<uint64_t, uint64_t> curr;
    queue<pair<uint64_t,uint64_t>> to_split;
    queue<pair<uint64_t,uint64_t>> next_iteration;
    to_split.push({n,m});
    uint64_t total =0;
    for (int i = dn-1; i>=0; i--) {
        while (to_split.size()>0){
            curr = to_split.front();
            to_split.pop();
            fit_n = curr.first/d[i];
            fit_m = curr.second/d[i];
            total += fit_m*fit_n;
            // TODO: check XD
            if (fit_n * d[i] < curr.first) {
                next_iteration.push({
                    curr.first-fit_n * d[i],
                    curr.second,
                });
            }
            if (fit_m *d[i] < curr.second) {
                next_iteration.push({
                    fit_n * d[i],
                    curr.second-fit_m * d[i],
                });
            }
        }
        to_split = next_iteration;
        next_iteration = queue<pair<uint64_t,uint64_t>>();
    }
    cout << total;
}
        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  | // #include <bits/stdc++.h> #define FAST ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0); #include <iostream> #include <vector> #include <queue> using namespace std; int main() { FAST uint64_t n,m, dn; cin >> n >> m >> dn; vector<uint64_t> d(dn); for (int i = 0; i < dn; i++) { cin >> d[i]; } if (n%d[0] != 0 || m %d[0] != 0 ) { cout << -1; return 0; } uint64_t fit_n, fit_m; pair<uint64_t, uint64_t> curr; queue<pair<uint64_t,uint64_t>> to_split; queue<pair<uint64_t,uint64_t>> next_iteration; to_split.push({n,m}); uint64_t total =0; for (int i = dn-1; i>=0; i--) { while (to_split.size()>0){ curr = to_split.front(); to_split.pop(); fit_n = curr.first/d[i]; fit_m = curr.second/d[i]; total += fit_m*fit_n; // TODO: check XD if (fit_n * d[i] < curr.first) { next_iteration.push({ curr.first-fit_n * d[i], curr.second, }); } if (fit_m *d[i] < curr.second) { next_iteration.push({ fit_n * d[i], curr.second-fit_m * d[i], }); } } to_split = next_iteration; next_iteration = queue<pair<uint64_t,uint64_t>>(); } cout << total; }  | 
            
        
                    English