Cod sursa(job #48173)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 4 aprilie 2007 14:23:34
Problema Diamant Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
# include <stdio.h>

const long int MAXX=210*210;
int g[500],n,m,k;long int x;
long int sp_poz[MAXX+1],sp_neg[MAXX+1],sp_neg_s[MAXX+1],sp_poz_s[MAXX+1];

long int retrieve(long int val)
{
if (val>MAXX||val<-MAXX) return 0;
if (val>=0) return sp_poz[val];
return sp_neg[-val];
}

void add_safe(long int val, long int retrieve)
{
if (val>=0) sp_poz_s[val]+=retrieve;
else sp_neg_s[-val]+=retrieve;
}

void copy_safe()
{
long int i;
for (i=0;i<=MAXX;i++)
	{
	sp_neg[i]=sp_neg_s[i]%10000;
	sp_neg_s[i]=0;
	sp_poz[i]=sp_poz_s[i]%10000;
	sp_poz_s[i]=0;
	}
}

void calculeaza()
{
sp_poz[g[1]]=1;sp_neg[g[1]]=1;sp_poz[0]=1;
long int i,val,stance;long int aux;
for (i=2;i<=n;i++)
	{
	for (val=MAXX;val>=-MAXX;val--)
		for (stance=-1;stance<=1;stance++)
		{
		aux=retrieve(val-g[i]*stance);
		add_safe(val,aux);
		}
	copy_safe();
	}
}

void citire()
{
FILE *f=fopen("diamant.in","r");
fscanf(f,"%d%d%ld",&n,&m,&x);
fclose(f);
}


void creaza_g()
{
int i,j,k=0;
for (i=1;i<=n;i++)
	for(j=1;j<=m;j++) g[++k]=i*j;
n=k;
}

void scrie()
{
FILE *g=fopen("diamant.out","w");
fprintf(g,"%lld\n",retrieve(x));
fcloseall();
}

int main()
{
citire();
creaza_g();
calculeaza();
scrie();
return 0;
}