#include <stdio.h>
//#include <conio.h>

long wys,szer,pom1,pom2,wielkosci[31],ile_wielkosci,SUM_OBRAZOW,nr_obr;



long ILE_OBRAZOW(long sz,long ww)
{
long ppp;
if (ww>sz)  {ppp=sz;  sz=ww;  ww=ppp;}
//printf("Obliczenia dla pola %ld x %ld\n",sz,ww);
if (ww==0) return 0;

// Szukam największego obrazu mieszczącego się w zadanym fragmencie
ppp = ile_wielkosci;
while (wielkosci[ppp]>ww) ppp--;
// Jeśli największym kwadratem jest ten najmniejszy (o wymiarze 1x1), to ten fragment będzie złożony tylko z najmniejszych
//printf("Obecnie najwiekszy obraz to: %ld\n",wielkosci[ppp]);
if (ppp==1) 
	{
//	 printf("Tylko najmniejszy, wiec zwraca %ld x %ld = %ld\n",sz,ww,sz*ww);
	 return sz*ww;
	}

// Pasek jest na szerokość jednego obrazu ... i na całą wysokość
// Takich pasków może być maksymalnie... sz/wielkosci[ppp]
// No i do tego trzeba dodać to, co zostało - wysokość ta sama, a szerokość... To reszta z dzielenia sz/wielkosci[ppp]

//printf("Jest zadanie, ze ILE(%ld,%ld) * %ld  ...\n",wielkosci[ppp],ww,long(sz/wielkosci[ppp]));
//printf("A do tego resztka: ILE(%ld,%ld) .\n",sz%wielkosci[ppp],ww);
//getch();

if (wielkosci[ppp]==ww)    return  long(sz/wielkosci[ppp]) + ILE_OBRAZOW(sz%wielkosci[ppp],ww);
else  return  ILE_OBRAZOW(wielkosci[ppp],ww) * long(sz/wielkosci[ppp]) + ILE_OBRAZOW(sz%wielkosci[ppp],ww);
}



int main()
{
scanf("%ld",&pom1);
scanf("%ld",&pom2);
if (pom1>pom2)   { szer=pom1;   wys=pom2; }
else { szer=pom2;   wys=pom1; }
scanf("%ld",&ile_wielkosci);
for (int ii=1; ii<=ile_wielkosci; ii++) scanf("%ld",&wielkosci[ii]);

// Na szybko sprawdzam, czy są podzielne - jeśli nie, to nie ma co liczyć. Jeśli tak, to można przedzielić całe zadanie.
if ((szer % wielkosci[1] == 0)  &&  (wys % wielkosci[1] == 0)) 
	{ // Można przeskalować zadanie
	 szer /= wielkosci[1];
	 wys /= wielkosci[1];
	 for (int ii=ile_wielkosci; ii>=1; ii--)  wielkosci[ii] /= wielkosci[1];
	}
else
	{ // Nie ma co liczyć
	 printf("-1");
	 return 0;
	}

// Obraz może być większy od ściany... Dobrze takie od razu odrzucić.
for (int ii=ile_wielkosci; ii>=1; ii--)   if (wielkosci[ii] > wys)   ile_wielkosci=ii-1;



//printf("Sciana  %ld x %ld\n", szer, wys);
//printf("Obrazy:  ");
//for (int ii=1; ii<=ile_wielkosci; ii++)   printf("%ld ",wielkosci[ii]);
//printf("\n");



// I teraz po kolei staram się "złożyć" jak najszersze, pionowe paski, czyli w sumie można forem, od największego do najmniejszego obrazu.
// Pasek będzie dokładnie o szerokości obecnie rozpatrywanego obrazu.

// No i ile obrazów mieści się w takim pasku???
// Najchętniej użyłbym rekurencji... Ale jednak pozostanę przy standardowym podejściu - dłużej, ale pewniej :)



SUM_OBRAZOW = ILE_OBRAZOW(szer,wys);

/*
for (nr_obr=ile_wielkosci; nr_obr>=1; nr_obr--)
	{
	 if (wys>szer)   { pom1=wys;   wys=szer;   szer=pom1; }
	 if (wielkosci[nr_obr] > wys)  continue;
	 
	 
	}
*/

if (SUM_OBRAZOW==0) printf("-1");
else printf("%ld",SUM_OBRAZOW);

// WSZYSTKIE OBRAZY MOGĄ BYĆ ZA DUŻE !!!! ... Ale to się wyłapie na etapie sprawdzania podzielności :)


return 0;
}




