Cod sursa(job #1851420)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 19 ianuarie 2017 18:55:18
Problema Cowfood Scor 56
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <cstdio>
#include<algorithm>
#define MOD 3210121

using namespace std;

int a[21][31];
int comb[10001];
int N, S, K;
int v[21];
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 == 1)
                    rezf = (rezf + comb[S - sum]) % MOD;
                else
                {
                    rezf = (rezf - comb[S - sum]) % MOD;
                    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;
    while(mv < 0)mv += MOD;
    rezf = (mv - rezf) % MOD;
    while(rezf < 0) rezf += MOD;
    printf("%d", rezf);
    return 0;
}