Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8. Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
  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
#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;
}