Cod sursa(job #35244)

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

#define dim 44101

int N, M;

long X, S;

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

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 ) 
                               {
                                   n -= n>=10000?10000:0;
                                   p -= p>=10000?10000:0;
                                   m -= m>=10000?10000:0;

                                   An[-k] = n+m+p;
                                   An[-k] -= An[-k]>=10000?10000:0;
                               }
                               else
                               {
                                   n -= n>=10000?10000:0;
                                   p -= p>=10000?10000:0;
                                   m -= m>=10000?10000:0;
                                   
                                   Ap[k] = n+m+p;
                                   Ap[k] -= Ap[k]>=10000?10000:0;
                               }
                      }
             }

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

	fclose(stdin);
    fclose(stdout);

	return 0;
}