Cod sursa(job #845587)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 31 decembrie 2012 08:37:55
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cstdlib>
#include <cstring>

const static int c_iMaxSum = 48000;
const static int c_iModulo = 10000;

using namespace std;

int diamonds[2][2*c_iMaxSum + 20];

int main()
{
    int n, m, X;
    vector<int> vPartials;
    
    fstream fin("diamant.in", fstream::in);
    fstream fout("diamant.out", fstream::out);
    
    fin >> n >> m >> X;
    //cout << n << " " << m << " " << X << endl;
    
    if (X < 0)
    {
        X = -X;
    }
    
    int sum = 0;
    for (int i=1; i<=n; ++i)
    {
        for (int j=1; j<=m; ++j)
        {
            vPartials.push_back(i*j);
            //vPartials.push_back(-i*j);
            sum += (i * j);
        }
    }
    
    if (X > sum)
    {
        fout << "0\n";
        return 0;
    }
    
    sort(vPartials.begin(), vPartials.end());
    
    /*ostream_iterator<int> itOut(cout, " ");
    copy(vPartials.begin(), vPartials.end(), itOut);
    cout << endl;*/
    
    //cout << sum << endl;
    
    //diamonds[0][0] = diamonds[1][0] = 1;
    diamonds[0][c_iMaxSum] = diamonds[1][c_iMaxSum] = 1;
    
    int current = 0;
    for (vector<int>::const_iterator it = vPartials.begin();
         it != vPartials.end();
         ++it)
    {
        //cout << *it << endl;

        for (int i=-sum; i<=sum; ++i)
        {   
            const int index = c_iMaxSum + i;
            
            diamonds[current][index] = (diamonds[!current][index] + diamonds[!current][index - *it] + diamonds[!current][index + *it]);
            diamonds[current][index] %= c_iModulo;
        }

        //copy(diamonds[current], diamonds[current] + 3*(X + 1), itOut);
        //cout << endl;
        
        current = !current;
    }
    
    current = !current;
    
    fout << diamonds[current][c_iMaxSum + X] << endl;
    
    fin.close();
    fout.close();
    return 0;
}