Cod sursa(job #35015)

Utilizator raula_sanChis Raoul raula_san Data 21 martie 2007 18:51:38
Problema Diamant Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>

#define dim 44101

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


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;

    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] <= X )
							   {
								  C[j+A[i]] += C[j];
								  C[j+A[i]] -= C[j+A[i]] >= 10000 ? 10000 : 0;

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

							  if( j - A[i] >= 1 )
							   {
								  C[j-A[i]] += C[j];
								  C[j-A[i]] -= C[j-A[i]] >= 10000 ? 10000 : 0;
							  }
						  }
		}

	}

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

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