Cod sursa(job #2453981)

Utilizator alexradu04Radu Alexandru alexradu04 Data 6 septembrie 2019 21:23:12
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <fstream>

using namespace std;

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

const int KMAX = 30;
const int SMAX = 10000;
const int NMAX = 20;
const int MOD = 3210121;

int K, S, N;

int v[NMAX + 5][KMAX + 5];
int dp[KMAX + 5][SMAX + 5];

int a[KMAX + 5];
int invalid;

void BK(int nivel, int used)
{
    if(nivel == N + 1)
    {
        if(used == 0 || a[0] > S)
            return ;

        if(used % 2 == 1)
            invalid = (invalid + dp[K][S - a[0]]) % MOD;
        else
            invalid = (invalid - dp[K][S - a[0]] + MOD) % MOD;

        return ;
    }

    BK(nivel + 1, used);

    int cpy[KMAX + 5] = {0};

    for(int i = 0; i <= K; i++)
        cpy[i] = a[i];

    for(int i = 1; i <= K; i++)
    {
        a[0] -= a[i];
        a[i] = max(a[i], v[nivel][i]);
        a[0] += a[i];
    }

    BK(nivel + 1, used + 1);

    for(int i = 0; i <= K; i++)
        a[i] = cpy[i];
}

int main()
{
    fin >> K >> S >> N;

    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= K; j++)
            fin >> v[i][j];

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

    for(int i = 2; i <= K; i++)
    {
        dp[i][0] = 1;

        for(int j = 1; j <= S; j++)
            dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % MOD;
    }

    for(int i = 1; i <= S; i++)
        dp[K][i] = (dp[K][i] + dp[K][i - 1]) % MOD;

    BK(1, 0);

    fout << (dp[K][S] - 1 - (K * S) % MOD - invalid + 2 * MOD) % MOD << '\n';

    return 0;
}