Cod sursa(job #799731)

Utilizator cat_red20Vasile Ioana cat_red20 Data 19 octombrie 2012 22:00:44
Problema Diamant Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<stdio.h>
#define MAX 21*21*100+1
int q[2*MAX],p[2*MAX],m,n,val,f,l,priv[2*MAX];
#define q (q + MAX)
#define p (p + MAX)
#define priv (priv + MAX)
FILE *fin,*fout;

void citire()
{
    fin=fopen("diamant.in","r");
    fscanf(fin,"%d %d %d",&m,&n,&val);
    fclose(fin);
    f=-m*(m+1)*n*(n+1)/4;
    l=-f;
}

void prelucrare()
{
    q[0]=1;
    int nr=0,x;
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            nr++;
            x=i*j;
            for(int k=f;k<=l;k++)
            {

                if(q[k]!=0)
                {
                    priv[k-x]=q[k-x];
                    q[k-x]=(q[k-x]+q[k])%10000;
                    p[k-x]=nr;
                }

            }
            for(int k=l;k>=f;k--)
            {
                if(q[k]!=0)
                {
                    if(p[k]!=nr)
                    {
                        q[k+x]=(q[k+x]+q[k])%10000;
                    }
                    else
                    {
                        q[k+x]=(q[k+x]+priv[k])%10000;
                    }
                    p[k+x]=nr;
                }
            }
        }
    }
}

void afisare()
{
    fout=fopen("diamant.out","w");
    fprintf(fout,"%d",q[val]);
}

int main()
{
   citire();
   prelucrare();
   afisare();
   return 0;
}