Cod sursa(job #3185172)

Utilizator SSKMFSS KMF SSKMF Data 18 decembrie 2023 10:52:27
Problema Diamant Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <fstream>
using namespace std;

ifstream cin ("diamant.in");
ofstream cout ("diamant.out");

int modalitati[2][88201] , _modalitati[2][8401];
const int mod = 10000;

int main ()
{
    int linii , coloane , valoare;
    cin >> linii >> coloane >> valoare;

    if (valoare < -linii * (linii + 1) / 2 * coloane * (coloane + 1) / 2 || linii * (linii + 1) / 2 * coloane * (coloane + 1) / 2 < valoare)
        { cout << '0'; }
    else
    {
        modalitati[0][44100] = 1;
        for (int linie = 1 ; linie <= linii ; linie++)
        {
            _modalitati[0][4200] = 1;
            for (int coloana = 1 , termen = linie , limita = linie * coloane * (coloane + 1) / 2 ; coloana <= coloane ; coloana++ , termen += linie)
            {
                for (int suma = -limita ; suma <= limita ; suma++) {
                    if (_modalitati[0][suma + 4200]) {
                        _modalitati[1][suma + 4200] += _modalitati[0][suma + 4200];
                        if (-limita <= suma - termen) { (_modalitati[1][suma - termen + 4200] += _modalitati[0][suma + 4200]) %= mod; }
                        if (suma + termen <= limita) { (_modalitati[1][suma + termen + 4200] += _modalitati[0][suma + 4200]) %= mod; }
                    }
                }

                swap(_modalitati[0] , _modalitati[1]);
            }

            for (int termen = -4200 ; termen <= 4200 ; termen++) {
                if (_modalitati[0][termen + 4200]) {
                    for (int suma = -44100 + max(0 , termen) ; suma + max(0 , -termen) <= 44100 ; suma++) {
                        (modalitati[1][suma + 44100] += modalitati[0][suma + 44100 - termen] * _modalitati[0][termen + 4200]) %= mod;
                    }
                }
            }

            swap(modalitati[0] , modalitati[1]);
            
            for (int indice = 0 ; indice <= 8400 ; indice++)
                { _modalitati[0][indice] = _modalitati[1][indice] = 0; }

            for (int indice = 0 ; indice <= 88200 ; indice++)
                { modalitati[1][indice] = 0; }
        }
    
        cout << modalitati[0][valoare + 44100];
    }

    cout.close(); cin.close();
    return 0;
}