Cod sursa(job #1762466)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 23 septembrie 2016 16:13:22
Problema Cowfood Scor 22
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <iostream>
#include <cstdio>
#define MAXK 33
#define MAXS 10050
#define MAXN 22
#define MOD 3210121

using namespace std;

int k, s, n;
int a[MAXN][MAXK];

void citire()
{
    scanf("%d %d %d", &k, &s, &n);
    for (int i = 1; i <= n; i++)
		for (int j = 1; j <= k; j++)
			scanf("%d", &a[i][j]);
}
int din[MAXK][MAXS], pre[MAXS];

void dinam()
{
    for (int i = 0; i <= s; i++)
		din[0][i] = 1;
	for (int i = 0; i <= k; i++)
		din[i][0] = 1;
    for (int i = 1; i <= k; i++)
        for (int j = 1; j <= s; j++)
            din[i][j] = (din[i][j-1] + din[i-1][j]) % MOD;
	for (int i = 0; i <= s; i++)
		pre[i] = din[k][i];
}

int rez, semn = 1, sol[MAXN][MAXK];

void solve(int step)
{
    if (step == n+1) {
        int sum = 0;
		for (int i = 1; i <= k; i++)
			sum += sol[step][i];
		if (sum <= s)
			rez = (MOD + rez + semn*pre[s-sum]) % MOD;
		return;
    }
    solve(step+1);
    semn *= -1;
    for (int i = 1; i <= k; i++)
		sol[step+1][i] = max(sol[step][i], a[step][i]);
	solve(step+1);
	semn *= -1;
}

int main()
{
    freopen("cowfood.in", "r", stdin);
    freopen("cowfood.out", "w", stdout);

    citire();
    dinam();
    solve(1);
    rez = (MOD + rez - (k*s+1)) % MOD;
    printf("%d", rez);

    return 0;
}