Cod sursa(job #35228)

Utilizator raula_sanChis Raoul raula_san Data 21 martie 2007 22:13:23
Problema Diamant Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>
#include <cstring>

#define dim 44101

int N, M;

long X, S;

int Ap[dim], An[dim];
int Bp[dim], Bn[dim];

void mod( int &x )
{
     if(x>=10000) x -= 10000;
     }

int main()
{
	freopen("diamant.in", "r", stdin);
	freopen("diamant.out", "w", stdout);

	scanf("%d %d %ld", &N,&M,&X);

	int i,j;
	long k;

	for(i=1; i<=N; ++i)
			 for(j=1; j<=M; ++j)
					  S += i*j;

    if( X>S )
    {
        printf("0");
        return 0;
    }

    Ap[0] = 1;
    
    int n,m,p;
    for(i=1; i<=N; ++i)
             for(j=1; j<=M; ++j)
             {
                      memcpy(Bp,Ap,sizeof(Ap));
                      memcpy(Bn,An,sizeof(An));
                      for(k=S; k>=-S; --k)
                      {
                               n = k<0 ? Bn[-k] : Bp[k];
                               m = k-i*j<0 ? Bn[-(k-i*j)] : Bp[k-i*j];
                               p = k+i*j<0 ? Bn[-(k+i*j)] : Bp[k+i*j];
                               
                               if( k<0 ) An[-k] = n+m+p, An[-k]-=An[-k]>=10000?10000:0;
                               else Ap[k] = n+m+p, Ap[k]-=Ap[k]>=10000?10000:0;
                      }
             }

    if( X<0 )
        printf("%d",An[-X]);
    else
        printf("%d",Ap[X]);

	fclose(stdin);
    fclose(stdout);

	return 0;
}