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

using lolo = long long;

struct Sciana {
	lolo x;
	lolo y;
};

lolo obrazuj(Sciana const& s, lolo const bok_obrazu) {
	return (s.x / bok_obrazu) * (s.y / bok_obrazu);	
}

void dodaj_niepuste(lolo x, lolo y, std::vector< Sciana >& sciany) {
	if (x == 0) { return; }
	if (y == 0) { return; }
	sciany.push_back(Sciana{ x, y });
}

std::vector< Sciana > scianuj(Sciana const& s, lolo bok_obrazu) {
	lolo tail_x = s.x % bok_obrazu;
	lolo tail_y = s.y % bok_obrazu;
	lolo head_x = s.x - tail_x;
	lolo head_y = s.y - tail_y;

	std::vector< Sciana > wynik;

	dodaj_niepuste(head_x, tail_y, wynik);
	dodaj_niepuste(tail_x, head_y, wynik);
	dodaj_niepuste(tail_x, tail_y, wynik);

	return wynik;
}

lolo rozwiaz(Sciana sciana, std::vector< lolo > boki)
{
	lolo bok_obrazu = boki.back();
	boki.pop_back();

	lolo ile  = obrazuj(sciana, bok_obrazu);
	std::vector< Sciana > kolejka = scianuj(sciana, bok_obrazu);

	for( Sciana& s : kolejka ) {
		ile += rozwiaz(s, boki);
	}

	return ile;
}

int main() {
	Sciana s;
	std::cin >> s.x >> s.y;

	lolo ile_rozm; std::cin >> ile_rozm;
	std::vector< lolo > rozm(ile_rozm);
	for( int i = 0; i < ile_rozm; ++i) { std::cin >> rozm[i]; };
	
	if (0 < scianuj(s, rozm[0]).size()) {
		std::cout << "-1\n";
	}
	else {
		std::cout << rozwiaz(s, rozm) << "\n";
	}
}