Cod sursa(job #283211)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 18 martie 2009 20:49:45
Problema Diamant Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MOD 10000
int n;
int i;
int vs;
int v[100003];
int v2[100003];
int no[100003];
int no2[100003];
int j;
int max;
int pr;
int s;
int k;
int mij;
int m;
long long x;

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

        scanf("%d %d %lld",&n, &m, &x);
        mij = 50000;
        for(i = 1; i <= n; i++)
         for(j = 1; j <= m; j++)
             max += i * j;
        if (abs(x) > max)
             {
             printf("0\n");
             return 0;
             }

        no[mij] = 1;
        v[mij] = 1;
        for(i = 1; i <= n; i++)
         for(j = 1; j <= m; j++)
            {
                    int val = i * j;
                    memcpy(v2,v,sizeof(v));
                    for(k = -s + mij; k <= s + mij; k++)
                    {
                        if (no[k])
                         no2[k] = 1;
                        if (no[k])
                         {
                           v2[k + val] = (v[k + val] + v[k]) % MOD;
                           no2[k + val] = 1;
                           v2[k - val] = (v[k - val] + v[k]) % MOD;
                           no2[k - val] = 1;
                         }
                    }
                    s += val;
                    memcpy(v,v2,sizeof(v));
                    memcpy(no,no2,sizeof(no));


            }
        printf("%d", v[mij+x]);
        return 0;
}