Cod sursa(job #426292)

Utilizator AndreyPAndrei Poenaru AndreyP Data 26 martie 2010 18:30:19
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.76 kb
#include<stdio.h>
#define N 44210
#define M 10000
int n,m,X;
int a[(N<<1)];
int v[410];
int main()
{
	freopen("diamant.in","r",stdin);
	freopen("diamant.out","w",stdout);

        scanf("%d%d%d",&n,&m,&X);
        for(int i=1; i<=n; ++i)
	{
		for(int j=1; j<=m; ++j)
			++v[i*j];
	}

        int lim=(n*(n+1)*m*(m+1))>>2;
        if(X<(-lim) || X>lim)
	{
		fputs("0\n",stdout);
		return 0;
	}

	a[0]=1;
	int aux=n*m+1;
	int lim1=lim<<1;
	int i1;
	for(int i=1; i<aux; ++i)
	{
		i1=i<<1;
		for(int j=0; j<v[i]; ++j)
		{
			for(int k=lim1-i; k>=0; --k)
			{
                        	a[k+i]+=a[k];
				if(a[k+i]>=M)
					a[k+i]-=M;
				if(k+i1>lim1)
					continue;
				a[k+i1]+=a[k];
				if(a[k+i1]>=M)
					a[k+i1]-=M;
			}
		}
	}
	aux=lim-X;
	printf("%d\n",a[aux]);

	return 0;
}