Cod sursa(job #1658215)

Utilizator SmarandaMaria Pandele Smaranda Data 21 martie 2016 10:51:01
Problema Cowfood Scor 54
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 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, sp [S];
int dp [S][K];


void preg (int n, int k) {
    int i, j;

    dp [0][0] = 1;
    for (i = 1; i <= n; 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 <= n; 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;
    }
}

void add (int k) {
    int i;

    for (i = 1; i <= lim; i ++)
        A [i] = max (A [i], a [k][i]);
}

int main () {
    int n, k, s, 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, k);
    total = dp [s + k - 1][k - 1] - dp [k - 1][k - 1] - k * s;
    while (total < 0)
        total += MOD;
    ns = (1 << n) - 1;
    lim = k;
    for (v = 1; v <= ns; v ++) {
        num = 0;
        memset (A, 0, sizeof (A));
        for (b = 0; b < n; b ++)
            if (v & (1 << b)) {
                add (b + 1);
                num ++;
            }
        sum = 0;
        for (b = 1; b <= k; b ++)
            sum += A [b];
        S = s - sum;
        if (S < 0)
            continue;
        ans = 0;
        ans = dp [S + k - 1][k - 1];

        if (num % 2 == 0) {
            total = total + ans;
            if (total >= MOD)
                total -= MOD;
        }
        else {
            total -= ans;
            while (total < 0)
                total += MOD;
        }
    }
    printf ("%d\n", total);
    return 0;
}