Cod sursa(job #2809354)

Utilizator DordeDorde Matei Dorde Data 26 noiembrie 2021 18:58:09
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>

using namespace std;
ifstream fin ("cowfood.in");
ofstream fout ("cowfood.out");
int const N = 1e4 + 35 , mod = 3210121;
int k , s , n , v [25][35], now [35] , dp [N][35] , total;
void add (int &x , int y){
    x += y;
    if (x >= mod)
        x -= mod;
    if (x < 0)
        x += mod;
}
void precalc (){
    dp [0][0] = 1;
    for(int i = 0 ; i < N - 1 ; ++ i){
        for(int j = 0 ; j <= min (k , i) ; ++ j){
            if (i)
                add (dp [i][j] , dp [i - 1][j]);
            if (i && j)
                add (dp [i][j] , dp [i - 1][j - 1]);
        }
    }
}
void read (){
    fin >> k >> s >> n;
    for(int i = 0 ; i < n ; ++ i)
        for(int j = 0 ; j < k ; ++ j)
            fin >> v [i][j];
}
int Cnt;
void bkt (int strat){
    int sum = 0;
    for(int i = 0 ; i < k ; ++ i)
        sum += now [i];
    if (sum > s)
        return;
    if (strat == n){
        if (sum < 2)
            return;
        if (Cnt & 1)
            add (total , -dp [s - sum + k][k]);
        else
            add (total , dp [s - sum + k][k]);
        return;
    }
    int thisone [31];
    for(int i = 0 ; i < k ; ++ i)
        thisone [i] = now [i];
    bkt (strat + 1);
    ++ Cnt;
    for(int i = 0 ; i < k ; ++ i)
        now [i] = max (now [i] , v [strat][i]);
    bkt (strat + 1);
    -- Cnt;
    copy (thisone , thisone + k , now);
}
int main()
{
    read ();
    precalc ();
    add (total , dp [s + k][k] - k * s - 1);
    bkt (0);
    fout << total << '\n';
    fin.close ();
    fout.close ();
    return 0;
}