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 <bits/stdc++.h>

using namespace std;

#define FOR(i, l, r) for(int i = (l); i <= (r); ++i)
#define REP(i, n) FOR(i, 0, (n) - 1)
#define rep(i, a, b) for(int i = a; i < (b); ++i)

#define all(x) x.begin(), x.end()
#define sz(x) (int)(x).size()
#define ssize(x) int(x.size())

#define int long long
#define pb push_back
#define fi first
#define se second
#define ld long double

typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pii;
typedef pair<ld, ld> pd;

using LL=long long;

#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 get_result(int H, int W, vector<int> starting) {
    vector<int> d;
    for (auto picture : starting) {
        if (picture <= min(H, W)) {
            d.pb(picture);
        }
    }

    auto get_division = [&] (int length) {
        vector<pii> division; // (value, how_many_times)
        for (auto picture : d) {
            int how_many = length / picture;

            if (how_many > 0) {
                division.pb({picture, how_many});
                length %= picture;
            }    
        }
        if (length != 0)
            division.clear();

        return division;
    };

    vector<pii> division_height = get_division(H);
    vector<pii> division_width = get_division(W);

    if (division_height.empty() || division_width.empty()) {
        cout << "-1\n";
        exit(0);
    }

    int res = division_height[0].se * division_width[0].se;
    
    int height = division_height[0].fi * division_height[0].se;
    int width = division_width[0].fi * division_width[0].se;
    
    for (int i = 1; i < division_width.size(); i++) {
        res += (height / division_width[i].fi) * division_width[i].se;
    }

    for (int i = 1; i < division_height.size(); i++) {
        res += (width / division_height[i].fi) * division_height[i].se;
    }

    int new_H = H - height;
    int new_W = W - width;

    if (new_H == 0 || new_W == 0) return res;
    else return res + get_result(new_H, new_W, starting);
}


void solve() {
    int H, W, N;
    cin >> H >> W >> N;

    vector<int> d(N);
    REP(i, N) cin >> d[i];
    sort(all(d), greater<int>());

    cout << get_result(H, W, d) << '\n';
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);

    int t = 1;
    //cin >> t;
    while (t--) {
        solve();
    }
}