Cod sursa(job #878191)

Utilizator thesilverhand13FII Florea Toma Eduard thesilverhand13 Data 14 februarie 2013 09:11:47
Problema Diamant Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>


# define dec 44150
# define mod 10000

using namespace std;

int N, M ,X;
int dp[ 3 ][ dec + 50 ];
int lim;
int sol;

int main()
{
    int i, j, k, ind = 1, val = 0;

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

    //f >> N >> M >> X;

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

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

        if ( X >= dec || X <= -dec )
         printf ("0");
           //g << 0 << "\n";
   else
   {
         dp[ 0 ][ dec ] = 1;

    for ( i = 1 ; i <= N ; ++i )
       for ( j = 1 ; j <= M ; ++j )
        {
            val = ind % 2;
            for ( k = -lim ; k <= lim ; ++k )
            {
                dp[ val ][ k + dec ] = 0;

                if ( k - i * j >= - dec )  // ca sa nu dea KBS,si sa nu adun o suma mai mica decat totalul elementelor "diamantelor"
                    dp[ val ][ k + dec ] = ( dp[ val  ][ k + dec ] + dp[ !val ][ k - i * j + dec ] );
                if ( k + i * j <= 2 * dec ) // ca sa nu adun o suma mai mare decat totalul elementelor "diamantului"
                    dp[ val ][ k + dec ] = ( dp[ val  ][ k + dec ] + dp[ !val ][ k + i * j + dec ] );

                dp[ val ][ k + dec ] = ( dp[ val ][ k + dec ] + dp[ !val  ][ k + dec ] ) % mod;// adun si sumele submultimii de ind - 1 diamante,ca in rucsac

                if (  k == X && ind == N * M )
                   sol = dp[ val ][ k + dec ];
            }
           // afisare( val );
            ind++;
        }

    printf ("%d", sol );
   }
    return 0;
}