Cod sursa(job #1683959)

Utilizator margikiMargeloiu Andrei margiki Data 10 aprilie 2016 17:54:28
Problema Cowfood Scor 14
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
# include <bits/stdc++.h>
# define MOD 3210121
# define NN 22
# define KK 32
# define NR 10005
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
int i,j,n,m,AUX,total,S,K,sol;
int current[KK], aux[NN][KK], v[NN][KK], dp[NN][NR];
void BACK (int niv, int nr) {
    if (niv==n+1) {
        if (nr==0) return;

        int sum=0;
        for (int i=1; i<=K; ++i)
            sum+=current[i];
        if (sum > S) return;

        if (nr%2==1) AUX=(AUX + dp[n][S-sum] + MOD) % MOD;
                else AUX=(AUX - dp[n][S-sum] + MOD) % MOD;

    } else {
        BACK (niv+1, nr); // nu mai adaug nimic

        //il adaug pe niv
        for (int i=1; i<=K; ++i) {
            aux[niv][i]=current[i];
            current[i]=max(current[i], v[niv][i]);
        }
        BACK (niv+1, nr+1);
        for (int i=1; i<=K; ++i)
            current[i]=aux[niv][i];
    }
}
int main ()
{
    f>>K>>S>>n;
    for (int i=1; i<=n; ++i)
        for (int j=1; j<=K; ++j)
            f>>v[i][j];

    //dp[i][j] - in cate moduri pot pune cel mult j bile in in i cutii

    for (j=0; j<=S; ++j)
        dp[0][j]=1;

    for (i=1; i<=K; ++i) { // cutii
        for (j=0; j<=S; ++j) { // bile
            if (j==0) dp[i][j]=1;
                 else dp[i][j]=(dp[i][j-1] + dp[i-1][j])%MOD;
        }
    }
    BACK (1, 0);
    sol=(dp[n][S] - AUX - S*K + MOD - 1)%MOD;
    g<<sol<<"\n";

    return 0;
}