Cod sursa(job #1303145)

Utilizator smaraldaSmaranda Dinu smaralda Data 27 decembrie 2014 17:40:25
Problema Cowfood Scor 42
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;

const int MOD = 3210121, NMAX = 21, KMAX = 31, SMAX = 10005;
int res, n, s, k, a[NMAX][KMAX], comb[SMAX + KMAX][KMAX], sumComb[SMAX + KMAX], lim[KMAX][KMAX];

inline bool testBit (int x, int bit) {
    return x & (1 << bit);
}

void genComb (int limi, int limj) {
    int i, j;

    for(i = 0; i <= limi; ++ i) {
        comb[i][0] = 1;
        for(j = 1; j <= i && j <= limj; ++ j)
            comb[i][j] = (comb[i - 1][j - 1] + comb[i - 1][j]) % MOD;
    }

    for(i = 1; i <= s; ++ i)
        sumComb[i] = (sumComb[i - 1] + comb[i + k - 1][k - 1]) % MOD;
}

void bkt (int lvl, int card) {
    int i, newSum;

  /*  fprintf(stderr, "\n\n%d %d\n", lvl, card);
    for(i = 1; i <= k; ++ i)
        fprintf(stderr, "%d ", lim[lvl][i]);*/
    if(lvl == n) {
        newSum = s;
        for(i = 1; i <= k; ++ i)
            newSum -= lim[lvl][i];
        if(newSum < 0) {
            res = (res - 1 + MOD) % MOD;
            return;
        }

        if(card % 2 == 0)
            res = (res + sumComb[newSum]) % MOD;
        else
            res = (res - sumComb[newSum]) % MOD;
        return;
    }
    

    for(i = 1; i <= k; ++ i)
        lim[lvl + 1][i] = lim[lvl][i];
    bkt(lvl + 1, card);

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

int main() {
    freopen("cowfood.in", "r", stdin);
    freopen("cowfood.out", "w", stdout);
    int i, j;

    scanf("%d%d%d", &k, &s, &n);
    for(i = 1; i <= n; ++ i)
        for(j = 1; j <= k; ++ j)
            scanf("%d", &a[i][j]);

    genComb(s + k - 1, k - 1);

    bkt(0, 0);
    printf("%d\n", (res - k * s - 1) % MOD);
    return 0;
}