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
//
// Created by piotr on 13.03.2024.
//
#include <cassert>
#include <cstdlib>
#include <cstdio>

int D[30];

long long mul(int x, int y) {
	return static_cast<long long>(x) * static_cast<long long>(y);
}

bool sprobuj(int X, int Y, long long& wynik, int* d, int* d_end) {
	if (!X || !Y) {
		return true;
	}
	if (d == d_end) {
		return false;
	}
	const int size = *d++;
	auto dx = std::div(X, size);
	auto dy = std::div(Y, size);
	if (dx.quot && dy.quot) {
		wynik += mul(dx.quot, dy.quot);
		return sprobuj(dx.rem, dy.quot*size, wynik, d, d_end)
				&& sprobuj(dx.quot*size, dy.rem, wynik, d, d_end)
				&& sprobuj(dx.rem, dy.rem, wynik, d, d_end);
	} else {
		return sprobuj(X, Y, wynik, d, d_end);
	}
}

int main() {
	int X, Y;
	assert(scanf("%d%d", &X, &Y) == 2);
	int N;
	assert(scanf("%d", &N) == 1);
	for (int i=1; i<=N; ++i) {
		assert(scanf("%d", &D[N-i]) == 1);
	}
	long long wynik = 0;
	printf("%lld\n", sprobuj(X, Y, wynik, D, D+N) ? wynik : -1);
}