Cod sursa(job #2508377)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 11 decembrie 2019 23:15:22
Problema Diamant Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin( "diamant.in" );
ofstream fout( "diamant.out" );

const int MOD = 10000;
const int DIF = 50000;

int N, M, X;

void Read()
{
    fin >> N >> M >> X;
}

void Do()
{
    int mx = 0;

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

    if( X > mx || X < - mx ) { fout << 0 << '\n'; return; }

    int dp[2][100005] = { 0 };
    int prev, curr;
    vector <int> val;

    prev = 0; curr = 1;

    for( int i = 1; i <= N; ++i )
      for( int j = 1; j <= M; ++j )
        val.push_back( i * j  );

    dp[curr][DIF] = dp[curr][ DIF - val[0] ] = dp[curr][ DIF + val[0] ] = 1;

    for( int i = 1; i < val.size(); ++i )
    {
        swap( curr, prev );

        for( int j = 0; j <= 2 * DIF; ++j )
        {
            if( j - val[i] > 0 ) dp[curr][j] += dp[prev][j - val[i]];
            if( j + val[i] < 2 * DIF ) dp[curr][j] += dp[prev][j + val[i]];

            dp[curr][j] += dp[prev][j];

            dp[curr][j] %= MOD;
        }
    }

    fout << dp[curr][X + DIF] << '\n';
}

int main()
{
    Read();
    Do();

    return 0;
}