Pagini recente » Cod sursa (job #2264321) | Cod sursa (job #2113750) | Cod sursa (job #1062641) | Cod sursa (job #1984419) | Cod sursa (job #35993)
Cod sursa(job #35993)
/* 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
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;
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)
Am[destinatie][-s] = (x+y+Am[sursa][-s])%10000;
else Ap[destinatie][s] = (x+y+Ap[sursa][s])%10000;
}
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;
}