Cod sursa(job #1850890)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 18 ianuarie 2017 23:59:57
Problema Cowfood Scor 4
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#define MOD 3210121
#define max(x,y) (x>y?x:y)

using namespace std;

int a[21][31];
int comb[10100][32];
int n, k, s;
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 + k - 1][k - 1]) % MOD;
                else
                {
                    rezf = (rezf - comb[s - sum + k - 1][k - 1]) % 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 = 0; i <= s; i++)
    {
        comb[i][0] = 1;
        for(j = 1; j <= i; j++)
        {
            comb[i][j] = (comb[i - 1][j] + comb[i - 1][j - 1]) % MOD;
        }
    }
    for(i = 1; i <= n; i++)
    {
        for(j = 1; j <= k; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }
    back();
    rezf = comb[s - 1][k - 1] - rezf;
    printf("%d", rezf);
    return 0;
}