Pagini recente » Cod sursa (job #2329299) | Cod sursa (job #972262) | Cod sursa (job #291969) | Cod sursa (job #996292) | Cod sursa (job #35996)
Cod sursa(job #35996)
/* Autor: Stoica A. Bogdan
Complexitate: O(N^2*M^2) */
//suma maxima care se poate obtine pentru un caroiaj de N*M
//este de (N*(M+1)*M*(N+1))/4, pe cel mai defavorabil caz ajungand la 44100
#include <stdio.h>
#define NMAX 50000
#define mod(a) (((a) >= 10000) ? (a)-10000:(a))
int Ap[2][NMAX], Am[2][NMAX], N, M, X;
int main()
{
int i, j, s, smax = 0, sursa = 0, destinatie = 1, z, y, x, rez;
freopen("diamant.in", "r", stdin);
scanf("%d %d %d", &N, &M, &X);
for (i = 1; i <= N; i++)
for (j = 1; j <= M; j++) smax+=(i*j);
if (X < 0) X = -X;
freopen("diamant.out", "w", stdout);
if (X > smax) { printf("0\n"); return 0; };
Am[0][0] = Ap[0][0] = 1;
for (i = 1; i <= N; i++)
for (j = 1; j <= M; j++)
{
for (s = smax; s >= -smax; s--)
{
if (s+i*j < 0) x = Am[sursa][-(s+i*j)];
else x = Ap[sursa][s+i*j];
if (s-i*j < 0) y = Am[sursa][-(s-i*j)];
else y = Ap[sursa][s-i*j];
if (s < 0)
{
rez = mod(x+y+Am[sursa][-s]);
while (rez >= 10000) rez = mod(rez);
Am[destinatie][-s] = rez;
}
else
{
rez = mod(x+y+Am[sursa][s]);
while (rez >= 10000) rez = mod(rez);
Ap[destinatie][s] = rez;
}
}
sursa = (sursa+1)&1; destinatie = (destinatie+1)&1;
}
if (X < 0) smax = Am[sursa][-X];
else smax = Ap[sursa][X];
freopen("diamant.out", "w", stdout);
printf("%d\n", smax);
return 0;
}