Cod sursa(job #1499387)

Utilizator Vlad_317Vlad Panait Vlad_317 Data 10 octombrie 2015 15:54:30
Problema Diamant Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>
#include <string.h>
using namespace std;

const int MAX=100000;
const int zero=45000;
const int MOD=10000;

int val1[MAX],min1,max1;
int val2[MAX],min2,max2;
int main()
{
    FILE *fin,*fout;

    fin=fopen("diamant.in","r");
    fout=fopen("diamant.out","w");

    int n,m;
    fscanf(fin,"%d%d",&n,&m);
    ///
    min1=min2=zero-1;
    max1=max2=zero+1;
    val1[0+zero]++;
    ///
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
        {
            for(int k=min1; k<=max1; k++)
                if(val1[k]!=0)
                {
                    val2[k]=(val2[k]+val1[k])%MOD;
                    val2[k+i*j]=(val2[k+i*j]+val1[k])%MOD;
                    val2[k-i*j]=(val2[k-i*j]+val1[k])%MOD;
                    if(k+i*j>max1 && k+i*j>max2)
                        max2=k+i*j;
                    if(k-i*j<min1 && k-i*j<min2)
                        min2=k-i*j;
                }
            min1=min2;
            max1=max2;
            min2=max2=0;
            for(int k=min1; k<=max1; k++)
            {
                val1[k]=val2[k];
                val2[k]=0;
            }
        }
    long long x;
    fscanf(fin,"%lld",&x);
    if(x!=0 && x<=45000)
        fprintf(fout,"%d",val1[x+zero]);
    else if (x==0)
        fprintf(fout,"%d",val1[x+zero]);
    else
        fprintf(fout,"0");
    return 0;
}