Cod sursa(job #35104)

Utilizator 004444Lapusan Tudor 004444 Data 21 martie 2007 20:27:58
Problema Diamant Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <stdio.h>
#define MAX 45002
#define MOD 10000


int n, m, x, nr_a, s_max, aux;
int a[402];
int c[2][MAX], c1[2][MAX];


void citire ();
void dinamica ();
void afisare ();

inline int abs ( int i )
{
	if ( i < 0 )
		return -i;
	return i;
}


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

    citire ();
    dinamica ();

    return 0;
}

void citire ()
{
    int i, j;

    scanf ( "%d %d %d", &n, &m, &x );
    
    for ( i = 1; i <= n; i++ )    
        for ( j = 1; j <= m; j++ )
        {
            a[++nr_a] = i * j;
			s_max += i * j;
        }
}

void dinamica ()
{
    int i, j, l0, l1, aux1;

//	for ( i = 0; i <= 10; i++ )
//		printf ( "%d ", c[0][i] );

	l0 = 0;
	l1 = 1;
//	c[l0][0] = 1;
	for ( i = 1; i <= nr_a; i++ )
	{
//        for ( j = 0; j <= s_max; j++ )
//            c[l1][j] = 0;


/*   		for ( j = 45000; j >= -45000; j-- )
			c[l1][abs(j)] += c[l0][abs(j - a[i])] + c[l0][abs(j + a[i])];
*/

		for ( j = 0; j <= s_max; j++ )
			c[l1][j + a[i]] = (c[l1][j + a[i]] + c[l0][j]) % MOD;

		for ( j = -s_max; j <= 0; j++ )
            c[l1][abs(j + a[i])] = ( c[l1][abs(j + a[i])] + c[l0][-j]) % MOD;

		c[l1][a[i]] = (c[l1][a[i]] + 1) %MOD;
		for ( j = 0; j <= s_max; j++ )
//            c[l1][j] = (c[l1][j] + c[l0][j]) % 10000;
			if ( c[l0][j] > c[l1][j] )
				c[l1][j] = c[l0][j] % MOD;
			else
				c[l0][j] = c[l1][j] % MOD;

		aux = l1;
		l0 = !l0;
		l1 = !l1;
	}

//	for ( i = 1; i <= s_max; i++ )
  //      printf ( "%d ", c[aux][i] );

	printf ( "%d", c[aux][x] );
}