Cod sursa(job #1864225)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 31 ianuarie 2017 17:19:24
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <cstdio>
#include<algorithm>
#define MOD 3210121

using namespace std;

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

void back()
{
    int sum;
    int k = 1;
    v[k] = 0;
    while(k > 0)
    {
        if(v[k] < N)
        {
            v[k]++;
            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];
            }
            if(S - sum >= 0)
            {
                if(k % 2 != 0)
                {
                    rezf += comb[S - sum];
                    rezf %= MOD;
                }
                else
                {
                    rezf -= comb[S - sum];
                    if(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;
    mv -= rezf;
    if(mv < 0) mv += MOD;
    printf("%d", mv);
    return 0;
}