Cod sursa(job #1658244)

Utilizator SmarandaMaria Pandele Smaranda Data 21 martie 2016 11:38:06
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 21, K = 31, S = 10032, MOD = 3210121;

int a [N][K], total = 0, A [K], lim, st [K], s, k, n;
int dp [S][K];


void preg (int lim) {
    int i, j;

    dp [0][0] = 1;
    for (i = 1; i <= lim; i ++) {
        dp [i][0] = 1;
      //  printf ("%d ", dp [i][0]);
        for (j = 1; j <= k; j ++) {
            dp [i][j] = dp [i - 1][j] + dp [i - 1][j - 1];
         //   printf ("%d ", dp [i][j]);
            if (dp [i][j] >= MOD)
                dp [i][j] -= MOD;
        }
      //  printf ("\n");
    }
    for (i = k; i <= lim; i ++) {
        dp [i][k - 1] = dp [i][k - 1] + dp [i - 1][k - 1];
        if (dp [i][k - 1] >= MOD)
            dp [i][k - 1] -= MOD;
    }
}

int ans (int *st) {
    int sum = 0, i;

    for (i = 1; i <= k; i ++)
        sum += st [i];
    sum = s - sum;
    if (sum < 0)
        return 0;
    return dp [sum + k - 1][k - 1];
}

void solve (int ind, int num, int *st) {
    int st2 [K], i;

    if (ind == n + 1) {
        if (num == 0)
            return;
        if (num % 2 == 0)
            total += ans (st);
        else total -= ans (st);
        while (total < 0)
            total += MOD;
        while (total >= MOD)
            total -= MOD;
        return;
    }
    for (i = 1; i <= k; i ++)
        st2 [i] = st [i];
    solve (ind + 1, num, st2);
    for (i = 1; i <= k; i ++)
        st2 [i] = max (st2 [i], a [ind][i]);
    solve (ind + 1, num + 1, st2);
}

int main () {
    int i, ns, sum, S, num, ans, j, v, b;

    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]);
    }
    preg (s + k - 1);
    total = dp [s + k - 1][k - 1] - dp [k - 1][k - 1] - k * s;
    while (total < 0)
        total += MOD;

    solve (1, 0, st);

    printf ("%d\n", total);
    return 0;
}