Cod sursa(job #878178)

Utilizator thesilverhand13FII Florea Toma Eduard thesilverhand13 Data 14 februarie 2013 08:47:47
Problema Diamant Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
 # include <fstream>
 # include <cstring>
 # include <algorithm>
 # include <vector>

 # define dec 44200
 # define mod 10000

 using namespace std;

 ifstream f("diamant.in");
 ofstream g("diamant.out");

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

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

     f >> N >> M >> X;

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

          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 ] ) % mod;
                 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 ] ) % mod;

                 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++;
         }

     g << sol;
     return 0;
 }