Pagini recente » Cod sursa (job #472744) | Cod sursa (job #2950964) | Cod sursa (job #946539) | Cod sursa (job #1467746) | Cod sursa (job #1437355)
#include <iostream>
#include <fstream>
#define prim 3210121
using namespace std;
int K,S,N,a[30][40],fact[12000],arr[40],nr;
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(fact[val])*inv(fact[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;
for (i=1; i<=11000; i++)
fact[i]=(1LL*fact[i-1]*i)%prim;
int res=((1LL*fact[S+K]*inv(fact[S])*inv(fact[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;
}