Cod sursa(job #35996)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 22 martie 2007 20:10:52
Problema Diamant Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 1.95 kb
/* 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;
        
}