Cod sursa(job #1499351)

Utilizator Vlad_317Vlad Panait Vlad_317 Data 10 octombrie 2015 15:27:16
Problema Diamant Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 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,x;
    fscanf(fin,"%d%d",&n,&m);
    ///
    min1=min2=zero;
    max1=max2=zero;
    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)
                        max2=k+i*j;
                    if(k-i*j<min1)
                        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;
            }
        }
    fscanf(fin,"%d",&x);
    if(x!=0)
        fprintf(fout,"%d",val1[x+zero]);
    else if (x<=45000)
        fprintf(fout,"%d",val1[x+zero]-1);
    else
        fprintf(fout,"0");
    return 0;
}