Pagini recente » Cod sursa (job #1095486) | Cod sursa (job #3139132) | Cod sursa (job #2787323) | Cod sursa (job #2351759) | Cod sursa (job #3220252)
#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 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 <= s; i++) c[i][0] = 1;
for(int i = 0; i <= k; i++) c[0][i] = 1;
for(int i = 1; i <= s; i++){
for(int j = 1; j <= k; j++) c[i][j] = (c[i - 1][j] + stars_and_bars2(i,j)) % mod;
}
}
void solve(int e){
memset(v, 0, sizeof v);
int t = 0, nrb = 0;
for(int i = 0; i < n; i++){
if((1 << i) & e){
nrb++;
for(int j = 1; j <= k; j++) v[j] = max(v[j], a[i][j]);
}
}
for(int j = 1; j <= k; j++) t += v[j];
if(t > s) return;
if(nrb & 1) rez -= c[s - t][k];
else rez += c[s - t][k];
}
int main()
{
int i,j;
fin >> n >> s >> k;
genf();
precalc();
for(i = 0; i < n; i++){
for(j = 1; j <= k; j++) fin >> a[i][j];
}
rez = ((c[s][k] - s * k - 1) % mod + mod) % mod;
for(int e = 1; e < (1 << n); e++) solve(e);
fout << rez;
return 0;
}