Cod sursa(job #35036)

Utilizator raula_sanChis Raoul raula_san Data 21 martie 2007 19:14:36
Problema Diamant Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <stdio.h>

#define dim 45000

int N, M, K;
int A[dim], C[dim], Uz[dim][401];

long X, S, Max;

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

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

    X *= X < 0 ? -1 : 1;

	int i, j, k;

    for(i=1; i<=N; ++i)
             for(j=1; j<=M; ++j)
             {
                      A[++K] = i * j;
					  S += i * j;
             }

    if( X > S )
        printf("0");
    else
    {
        for(i=1; i<K; ++i)
                 for(j=i+1; j<=K; ++j)
                            if( A[i] > A[j] )
                                A[i] ^= A[j] ^= A[i] ^= A[j];
        
        Max = 0;
        C[0] = 1;
        
        for(i=1; i<=K; ++i)
				 for(j=Max; j>=0; --j)
						  if( C[j] )
							   if( j + A[i] <= S )
							   {
								  C[j+A[i]] += C[j];
								  C[j+A[i]] -= C[j+A[i]] >= 10000 ? 10000 : 0;

								  for(k=1; k<=K; ++k)
									Uz[j+A[i]][k] = Uz[j][k];

								  Uz[j+A[i]][i] = 1;

								  if( j + A[i] > Max )
									Max = j + A[i];
							   }

	}

	// Uz[i][j] -> daca am folosit elenentul j pentru a forma suma i

	for(i=1; i<=K; ++i)
		for(j=0; j<=Max; ++j)
			if( C[j] && j - A[i] >= 0 && !Uz[j][i] )
			{
				C[j-A[i]] += C[j];
				C[j-A[i]] -= C[j-A[i]] >= 10000 ? 10000 : 0;

				Uz[j][i] = 1;
			}

	printf("%d", C[X]);

    fclose(stdin);
    fclose(stdout);
    
    return 0;
}