Cod sursa(job #1550895)

Utilizator TimoteiCopaciu Timotei Timotei Data 14 decembrie 2015 21:07:22
Problema Diamant Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<fstream>
#include <cmath>
#define mod 10000
using namespace std;

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

int N, M ,X, D, v[805], dp[405][44105], s;
int main()
{
    f >> N >> M >> X;
    int P = N * M;
    int sMax = 0;
    for(int i = N; i>= 1; i--)
        for(int j = M; j >= 1; j--)
    {
        v[(i - 1) * M + j + P] = i * j;
        D++;
        v[D] = -( i * j);
        sMax+= i * j;
    }

     D*=2;
     dp[0][0] = 1;

     for(int i = 1; i <= D/2; i++)
        for(int j = sMax - v[i + D/2]; j >= 0; j--)
     {
         dp[i][j] = dp[i - 1][j];
         if(dp[i][j] != 0 ){
            dp[i][j + v[i + D/2]] += dp[i][j];
             dp[i][j + v[i + D/2]]%= mod;
         }
     }

     for(int i = 1; i <= D/2; i++){

        for(int j = -v[i]; j <= sMax; j++)
    {

         if(dp[i][j] != 0 ){
            dp[i][j + v[i]] += dp[i][j];
            dp[i][j + v[i]]%= mod;
         }
     }
    s+= dp[i][0];
    s%= mod;
     }
       if(s == 0)s = 9999;
       else dp[D/2][0] = s - 1;
         X = abs(X);
         if(X > sMax) g << 0;
       else g << dp[D/2][X];

  return 0;
}