Cod sursa(job #36309)

Utilizator alextheroTandrau Alexandru alexthero Data 23 martie 2007 13:21:12
Problema Diamant Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <stdio.h>
#include <string.h>

#define modulo 10000
#define nmax 20
#define valplus 44105
#define valmax 88215

int n,m,x,val,x1;
int a[valmax],b[valmax];

inline int f(int x) {
    return x + valplus;
}

int main() {
    freopen("diamant.in","r",stdin);
    freopen("diamant.out","w",stdout);

    scanf("%d %d %d\n",&n,&m,&x);
    for(int i = 0; i < valmax; i++) a[i] = b[i] = -1;
    a[f(0)] = 1;
    int vmax = 0,nvmax = 0;
    for(int i = 1; i <= n; i++) 
        for(int j = 1; j <= m; j++) {
            memset(b,-1,sizeof(b));
            for(int k = -vmax; k <= vmax; k++) {
                x1 = f(k);
                if(a[x1] != -1) {
                    int nv = k + i * j; 
                    if(nv > nvmax) nvmax = nv;
                    nv = f(nv);
                    if(b[nv] == -1) b[nv]++;
                    b[nv] += a[x1];
                    if(b[nv] > modulo) b[nv] -= modulo;
            
                    nv = k;
                    nv = f(nv);
                    if(b[nv] == -1) b[nv]++;
                    b[nv] += a[x1];
                    if(b[nv] > modulo) b[nv] -= modulo;

                    nv = k - i * j;
                    nv = f(nv);
                    if(b[nv] == -1) b[nv]++;
                    b[nv] += a[x1];
                    if(b[nv] > modulo) b[nv] -= modulo;
                }
            }
            if(vmax < nvmax) vmax = nvmax;
            for(int k = -vmax; k <= vmax; k++) 
                a[f(k)] = b[f(k)];
        }
    printf("%d\n",a[f(x)]);
    return 0;
}