Cod sursa(job #3250432)

Utilizator iulia_morariuIuli Morariu iulia_morariu Data 20 octombrie 2024 20:18:45
Problema Diamant Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 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;
    //     }
    // }

    int x = 1, y = 1;
    dp[0][offs] = 1; // 44100 e offsetu de la 0
    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]];
                dp[1][j] %= mod;
            }

            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++) swap( dp[0][j], dp[1][j] );
    }

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

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

    return 0;
}