Pagini recente » Cod sursa (job #3191249) | Cod sursa (job #2414907) | Cod sursa (job #2677565) | Cod sursa (job #1605555) | Cod sursa (job #3220268)
#include <bits/stdc++.h>
#define mod 3210121
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
int f[10055];
int inv[10055];
int a[22][32];
int sb2[10005][32];
int c[10005][32];
int v[31];
int rez,n,s,k;
void euclid(int a, int b, int &x, int &y){
if(!b){
x = 1;
y = 0;
return;
}
int x0,y0;
euclid(b, a % b, x0, y0);
x = y0;
y = x0 - (a / b) * y0;
}
int invmod(int n){
int x,y;
euclid(n,mod,x,y);
return (x % mod + mod) % mod;
}
int comb(int n, int k){
if(k > n) return 0;
return (1LL * f[n] * inv[k] % mod * inv[n - k]) % mod;
}
int stars_and_bars2(int n, int k){
return comb(n + k - 1, k - 1);
}
void genf(){
f[0] = inv[0] = 1;
for(int i = 1; i <= 10050; i++){
f[i] = (1LL * f[i - 1] * i) % mod;
inv[i] = invmod(f[i]);
}
}
void precalc(){
for(int i = 0; i <= k + 1; i++) sb2[0][i] = c[0][i] = 1;
for(int i = 1; i <= s; i++){
for(int j = 1; j <= k + 1; j++){
sb2[i][j] = (sb2[i - 1][j] + sb2[i][j - 1]) % mod;
c[i][j - 1] = sb2[i][j];
}
}
}
int last[32][32];
int st[32];
void backt(int e, int t){
if(e == n + 1){
if(!t) return;
int stemp = 0;
for(int i = 1; i <= k; i++) stemp += last[t][i];
if(s >= stemp){
if(t & 1) rez = ((rez - c[s - stemp][k]) % mod + mod) % mod;
else rez = (rez + c[s - stemp][k]) % mod;
}
return;
}
backt(e + 1, t);
st[e] = 1;
for(int i = 1; i <= k; i++) last[t + 1][i] = max(last[t][i], a[e][i]);
backt(e + 1, t + 1);
st[e] = 0;
}
int main()
{
int i,j;
fin >> k >> s >> n;
//genf();
precalc();
for(i = 1; i <= n; i++){
for(j = 1; j <= k; j++) fin >> a[i][j];
}
rez = ((c[s][k] - s * k - 1) % mod + mod) % mod;
backt(1,0);
fout << rez;
return 0;
}