Cod sursa(job #1863584)

Utilizator Y.MalmsteenB.P.M. Y.Malmsteen Data 31 ianuarie 2017 00:24:30
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.64 kb
#include <cstdio>
#include<algorithm>

using namespace std;
const int MOD = 3210121;

int N, S, K;
int a[21][31], best[21][31];
int comb[10001];
int v[25];
int rezf = 0;

void back()
{
    int k = 1;
    v[k] = 0;
    while(k > 0)
    {
        if(v[k] < N)
        {
            v[k]++;
            int sum = 0;
            for(int i = 1; i <= K; i++)
            {
                best[k][i] = max(best[k - 1][i], a[v[k]][i]);
                sum += best[k][i];
            }
            int dif = S - sum;
            if(dif >= 0)
            {
                if(k % 2 != 0)
                {
                    rezf += comb[dif];
                    rezf %= MOD;
                }
                else
                {
                    rezf -= comb[dif];
                    while(rezf < 0) rezf += MOD;
                }
            }
            k++;
            v[k] = v[k - 1];
        }
        else k--;
    }
}

int main()
{
    int i, j;
    freopen("cowfood.in", "r", stdin);
    freopen("cowfood.out", "w", stdout);
    scanf("%d%d%d", &K, &S, &N);
    for(i = 1; i <= N; i++)
    {
        for(j = 1; j <= K; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }
    for(i = 0; i <= S; i++)
        comb[i] = 1;
    for(i = 1; i <= K; i++)
    {
        for(j = 1; j <= S; j++)
        {
            comb[j] += comb[j - 1];
            comb[j] %= MOD;
        }
    }
    back();
    int mv = (comb[S] - S * K - 1) % MOD;
    if(mv < 0)mv += MOD;
    rezf = (mv - rezf) % MOD;
    if(rezf < 0) rezf += MOD;
    printf("%d", rezf);
    fclose(stdout);
    return 0;
}