Pagini recente » Cod sursa (job #165883) | Cod sursa (job #251325) | Cod sursa (job #1938874) | Cod sursa (job #3140003) | Cod sursa (job #1437356)
#include <iostream>
#include <fstream>
#define prim 3210121
using namespace std;
int K,S,N,a[30][40],fact[12000],arr[40],nr,INV[12000];
int inv(int nr){
int p=prim-2,res=1;
while (p){
if (p&1)
res=(1LL*res*nr)%prim;
nr=(1LL*nr*nr)%prim;
p>>=1;
}
return res;
}
void bck(int k, int cnt){
if (cnt==0){
int i,val=S;
for (i=1; i<=K; i++)
val-=arr[i];
if (val<0) return;
nr=(nr+1LL*fact[val+K]*INV[val]*INV[K])%prim;
return ;
}
if (N-k>=cnt) bck(k+1,cnt);
int prev[40],i;
for (i=1; i<=K; i++)
prev[i]=arr[i];
for (i=1; i<=K; i++)
arr[i]=max(arr[i],a[k][i]);
bck(k+1,cnt-1);
for (i=1; i<=K; i++)
arr[i]=prev[i];
}
int main(){
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
fin >> K >> S >> N;
int i,j;
for (i=1; i<=N; i++)
for (j=1; j<=K; j++)
fin >> a[i][j];
fact[0]=1;
INV[0]=0;
for (i=1; i<=11000; i++){
fact[i]=(1LL*fact[i-1]*i)%prim;
INV[i]=inv(fact[i]);
}
int res=((1LL*fact[S+K]*INV[S]*INV[K]-K*S-1)%prim+prim)%prim;
for (i=1; i<=N; i++){
nr=0;
bck(1,i);
if (i%2) res=(res-nr)%prim;
else res=(res+nr)%prim;
if (res<0) res+=prim;
}
fout << res << "\n";
return 0;
}