Pagini recente » Cod sursa (job #1540390) | Cod sursa (job #2913679) | Cod sursa (job #1603850) | Cod sursa (job #2533645) | Cod sursa (job #1303117)
#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], esuat[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;
if(lvl == n) {
newSum = s;
for(i = 1; i <= k; ++ i)
newSum -= lim[lvl][i];
if(newSum < 0)
return;
if(card % 2 == 0)
res = (res + sumComb[newSum]) % MOD;
else
res = (res - sumComb[newSum]) % MOD;
return;
}
bkt(lvl + 1, card);
for(i = 1; i <= k; ++ i)
lim[lvl][i] = max(lim[lvl - 1][i], a[lvl][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);
if(n == 0) {
printf("%d\n", sumComb[s] - k * s);
return 0;
}
bkt(1, 0);
printf("%d\n", res - k * s - 1);
return 0;
}