Pagini recente » Cod sursa (job #1098793) | Cod sursa (job #2134193) | Cod sursa (job #806063) | Cod sursa (job #2952138) | Cod sursa (job #1437365)
#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;
for (i=1; i<=K; i++)
val-=arr[i];
if (val>=0) 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;
}