Cod sursa(job #1811470)

Utilizator eragon0502Dumitrescu Dragos eragon0502 Data 21 noiembrie 2016 11:42:49
Problema Diamant Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>

using namespace std;
const int N=45000;
int aux[2*N+1],auxp[2*N+1],auxm[2*N+1];
int *nr,*nrp,*nrm;
int main()
{
    freopen("diamant.in","r",stdin);
    freopen("diamant.out","w",stdout);
    int i,j,n,m,s=0,k,rez,x;
    scanf("%d %d %d",&n,&m,&rez);
    /*for(i=1;i<=n;++i)
    {
        for(j=1;j<=m;++j){
            printf("%d ",i*j);
            s+=(i*j);
            }
        printf("\n");
    }
    printf("%d",s);*/
    nr=aux+N;
    nrp=auxp+N;
    nrm=auxm+N;
    s=m*(m+1)/2*n*(n+1)/2;
   /* for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
            s+=(i*j);*/
    nr[0]=1;
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
        {
            x=i*j;
            //for(k=-s;k<=s-x;++k)
            for(k=s-x;k>=-s;--k){
                nrp[k+x]+=nr[k];
                if(nrp[k]>=10000)
                    nrp[k]-=10000;
                }
            //for(k=s;k>=-s+x;--k)
            for(k=-s+x;k<=s;++k){
                nrm[k-x]+=nr[k];
                if(nrm[k]>=10000)
                    nrm[k]-=10000;
                }
            for(k=-s;k<=s;++k)
                {
                nr[k]+=(nrm[k]+nrp[k]);
                if(nr[k]>=10000)
                    nr[k]-=10000;
                nrm[k]=0;
                nrp[k]=0;
                }
        }
   /* y=0;
    for(i=-s+rez;i<=s-rez;++i)
        {
            if(nrp[])
        }*/
    printf("%d",nr[rez]);
    return 0;
}