Pagini recente » Cod sursa (job #3179951) | Cod sursa (job #589820) | Cod sursa (job #2671108) | Cod sursa (job #528882) | Cod sursa (job #1437364)
#include <iostream>
#include <fstream>
#define prim 3210121
using namespace std;
int K,S,N,a[30][40],arr[40],nr,comb[11000][40];
void bck(int k, int cnt){
if (cnt==0){
int i,val=S,aux=0,aux2=0;
for (i=1; i<=K; i++){
val-=arr[i];
if (arr[i]!=0) aux++,aux2=arr[i];
}
if (val<0) return;
if (aux==0) {
nr=(nr+((comb[S+K][K]-K*S-1)%prim))%prim;
if (nr<0) nr+=prim;
}
else if (aux==1){
nr=(nr-(S-aux2+1))%prim;
if (nr<0) nr+=prim;
}
else{
nr=nr+comb[val+K][K];
if (nr>=prim) nr-=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];
comb[0][0]=1;
for (i=1; i<=S+K; i++){
comb[i][0]=1;
for (j=1; j<=K; j++){
comb[i][j]=comb[i-1][j]+comb[i-1][j-1];
if (comb[i][j]>=prim) comb[i][j]-=prim;
}
}
int res=(comb[S+K][K]-K*S-1)%prim;
if (res<0) res+=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;
}