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
#include <iostream>
#include <algorithm>
#include <stack>

using namespace std;


long long int H, W;
const int MAX_N = 31;

long long int D[MAX_N];

int N;

pair<long long int, long long int> mp(long long int a, long long int b) {
    return make_pair( min(a, b), max(a, b));
}

int find(long long int size) {
    for (int i = N - 1; i >= 0; i--) {
        if (D[i] <= size) {
            return D[i];
        }
    }
    return -1;
}

long long int licz() {
    stack<pair<long long int, long long int>> stos;
    long long int cnt = 0;
    stos.push(mp(H, W));

    while (!stos.empty()) {
        pair<int, int> next = stos.top();
        stos.pop();
        
        long long int h = next.first;
        long long int w = next.second;
        long long int d = find(h);

        if (d == -1) return -1;

        cnt += (h / d) * (w / d);

        long long int h1 = h % d;
        long long int w1 = d * (w/d);
        if (h1 != 0 && w1 != 0) {
            stos.push(mp(h1, w1));
        }

        long long int w2 = w % d;
        if (h != 0 && w2 != 0) {
            stos.push(mp(h, w2));
        }
    }
    return cnt;
}

int main()
{
    cin >> H >> W >> N;
    for (int i = 0; i < N; i++)
    {
        cin >> D[i];
    }
    cout << licz() << endl;
    return 0;
}