Cod sursa(job #1729821)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 15 iulie 2016 17:58:42
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
///Links! Links! Links! (Ich bin Ernst Busch)
#include <bits/stdc++.h>
using namespace std;

const int NMAX = 25,
          KMAX = 35,
          SMAX = 10005,
          MOD  = 3210121;

int k, s, n, drop;
int  dp[SMAX][KMAX],
     wg[NMAX][KMAX],
    stk[NMAX][KMAX];

inline bool check(int arg) {
    int ts = 0;

    for(int i=1; i<=k; ++i) {
        ts+=wg[arg][i];
        if(ts>s)
            return false;
    }

    return true;
}

inline void bkt(int lvl, int lst, int bits) {
    if(lvl > n) {
        int ts = 0;

        if(!bits)
           return;

        for(int i=1; i<=k; ++i)
            ts+= stk[lst][i];

        if(bits%2)
            drop = (drop + dp[s-ts][k]) % MOD;
        else
            drop = (drop - dp[s-ts][k]) % MOD;
    }
    else {
        int ts = 0;

        for(int i=1; i<=k; ++i)
            stk[lvl][i] = 0;

        bkt(lvl+1, lst, bits);

        for(int i=1; i<=k; ++i) {
            stk[lvl][i] = max(stk[lst][i], wg[lvl][i]);
            ts += stk[lvl][i];
            if(ts > s)
                return;
        }
        bkt(lvl+1, lvl, bits+1);
    }
}

int main(void) {
    freopen("cowfood.in",  "r", stdin);
    freopen("cowfood.out", "w", stdout);
    int c, t;

    scanf("%d%d%d",&k,&s,&n);
    for(int i=1; i<=n; ++i) {
        for(int j=1; j<=k; ++j)
            scanf("%d",&wg[i][j]);
        if(!check(i)) {
            --n;
            --i;
        }
    }

    for(int j=0; j<=k+1; ++j)
        dp[0][j] = 1;

    for(int i=1; i<=s+1; ++i)
        for(int j=0; j<=k+1; j++)
            if (j == 0 || j == 1) dp[i][j] = 1;
            else dp[i][j] = (dp[i-1][j] + dp[i][j-1]) % MOD; ///scz...


    for(int i=1; i<=s+1; ++i)
        for(int j=1; j<=k+1; ++j)
            dp[i][j] = (dp[i][j] + dp[i-1][j]) % MOD;

    bkt(1, 0, 0);

    printf("%d\n", ((dp[s][k]-drop-s*k-1)%MOD+MOD)%MOD);

    fclose(stdin);
    fclose(stdout);
    return 0;
}