Pagini recente » Cod sursa (job #1416787) | Cod sursa (job #650287) | Cod sursa (job #3210739) | Cod sursa (job #2111819) | Cod sursa (job #1729823)
///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;
}