Cod sursa(job #3250433)

Utilizator iulia_morariuIuli Morariu iulia_morariu Data 20 octombrie 2024 20:26:38
Problema Diamant Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
//#include <bits/stdc++.h>
#define in fin
#define out fout
#define mod 10000
#define ll long long

using namespace std;

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

ll dp[2][88402];

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    ll n, m, cost; in >> n >> m >> cost;
    // avem la fiecare 3 cazuri : ignore (0), 1 sau -1
    vector<int> v;

    ll offs = 0;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            v.push_back( i * j );
            offs += i * j;
        }
    }
    sort(v.begin(), v.end());

    // if(abs(cost) > offs){
    //     out << '0\n';
    //     return 0;
    // }

    // c.insert(c.begin(), 0);

    // cout << "v : ";
    // for(int i = 0; i < v.size(); i++) cout << v[i] << " ";
    // cout << '\n';
    // for(int i = 0; i <= n * m * 2; i++){
    //     for(int j = 0; j <= offs * 2; j++){
    //         dp[i][j] = 0;
    //     }
    // }

    if(cost < offs * (-1) || offs < cost){
        out << "0\n";
        return 0;   
    }

    dp[0][offs] = 1; // 44100 e offsetu de la 0 pt caz maxim
    dp[0][offs - 1] = 1;
    dp[0][offs + 1] = 1;

    // e -1/+1 pt ca primul e 1
    for(int i = 1; i < v.size(); i++){ 
        for(int j = 0; j <= offs * 2 + 1; j++){
            dp[1][j] += dp[0][j];
            if(j - v[i] >= 0){
                dp[1][j] += dp[0][j - v[i]];
            }

            if(j + v[i] <= offs * 2 + 1){
                dp[1][j] += dp[0][j + v[i]];
            }

            dp[1][j] %= mod;
        }

        for(int j = 0; j <= offs * 2 + 1; j++){
            int aux = dp[1][j];
            dp[0][j] = aux;
            dp[1][j] = 0;

            // refresh
        }
    }

    // cout << "offset = " << offs << '\n';

    out << dp[0][offs + cost] << '\n';

    return 0;
}