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
113
114
115
#include <iostream>
#include <utility>


using namespace std;


typedef  int64_t  lli;


static lli iH, iW;

static int iN;

static lli aD[32];


static void ReadData()
{
	cin >> iH >> iW >> iN;

	for (int i = 0; i < iN; ++i)
	{
		cin >> aD[i];
	}
}


static bool IsItPossible()
{
	if (aD[0] == 1)
	{
		return true;
	}

	if (iH < aD[0] || iW < aD[0])
	{
		return false;
	}

	return ((iH % aD[0]) == 0) && ((iW % aD[0]) == 0);
}


static inline void MakeLandscape(lli & x, lli & y)
{
	if (y <= x)
		return;

	swap(x, y);
}


static lli Recursive(lli x, lli y, int iLevel)
{
	if (x == 0 || y == 0)
		return 0;

	if (iLevel == 0 || ((x % aD[iLevel] == 0) && (y % aD[iLevel] == 0)))
	{
		return (x / aD[iLevel]) * (y / aD[iLevel]);
	}

	MakeLandscape(x, y);

	while (aD[iLevel] > y)
	{
		iLevel--;
	}

	if (iLevel == 0 || ((x % aD[iLevel] == 0) && (y % aD[iLevel] == 0)))
	{
		return (x / aD[iLevel]) * (y / aD[iLevel]);
	}

	lli iRet = (x / aD[iLevel]) * (y / aD[iLevel]);

	lli iRemX = x % aD[iLevel];
	lli iRemY = y % aD[iLevel];

	iLevel--;

	iRet += Recursive(iRemX, iRemY, iLevel);

	iRet += Recursive(x - iRemX, iRemY, iLevel);

	iRet += Recursive(iRemX, y - iRemY, iLevel);

	return iRet;
}


static void Solve()
{
	if (!IsItPossible())
	{
		cout << -1;
		return;
	}

	cout << Recursive(iW, iH, iN - 1);
}


static void OneCase()
{
	ReadData();
	Solve();
}


int main()
{
	OneCase();
}