Cod sursa(job #1901310)

Utilizator trutruvasilicaHuhurez Marius trutruvasilica Data 3 martie 2017 21:03:32
Problema Diamant Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>
#include <cstdlib>
using namespace std;
ifstream fin("diamant.in");
ofstream fout("diamant.out");
int pls[2][50105],cost[1001],mns[2][50000];
const int mod=10000;
int main()
{
    int n,m,x,i,j;
    fin>>n>>m>>x;
    int rez=0;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            rez+=i*j;
            cost[(i-1)*n+j]=i*j;
        }
    }
    pls[0][0]=mns[0][0]=1;
    int tot=n*m;
    int ct,ant;
    for(i=1;i<=tot;i++)
    {
        ct=i&1;
        ant=(i+1)&1;
        for(j=0;j<=rez;j++)
        {
            pls[ct][j]=pls[ant][j];
            mns[ct][j]=mns[ant][j];
            pls[ct][j]=(pls[ct][j]+pls[ant][j+cost[i]])%mod;
            mns[ct][j]=(mns[ct][j]+mns[ant][j+cost[i]])%mod;
            if(j>=cost[i]) pls[ct][j]=(pls[ct][j]+pls[ant][j-cost[i]])%mod;
            else if(j<cost[i]) pls[ct][j]=(pls[ct][j]+mns[ant][cost[i]-j])%mod;


            if(j>=cost[i]) mns[ct][j]=(mns[ct][j]+mns[ant][j-cost[i]])%mod;
            else if(j<cost[i]) mns[ct][j]=(mns[ct][j]+pls[ant][cost[i]-j])%mod;
        }
    }
    if(x>0 && x>rez) fout<<"0";
    else if(x<0 && -x >rez) fout<<"0";
    else
    {
        ct=tot&1;
        if(x>0) fout<<pls[ct][x];
        else fout<<mns[ct][-x];
    }
}