Pagini recente » Cod sursa (job #2525448) | Cod sursa (job #474305) | Cod sursa (job #783238) | Cod sursa (job #1399433) | Cod sursa (job #1485936)
#include<algorithm>
#include<fstream>
#define MOD 3210121
using namespace std;
ifstream f("cowfood.in"); ofstream g("cowfood.out");
int n,k,s,nr1,tot;
int d[10010][33],M[33],v[33][33],x[33];
inline int maxim(int a, int b) {return (a>b ? a : b);}
void back(int K)
{ int MA[33];
if(K==n)
{ if(nr1==0) return;
int semn,sum=0;
for(int t=1;t<=k;t++) sum+=M[t];
if(sum>s) return;
if(nr1%2) semn=1; else semn=-1;
tot+=(d[s-sum][k+1]*semn);
if(tot<0) tot+=MOD;
if(tot>=MOD) tot-=MOD;
}
else
{ for(int y=0;y<=1;y++)
{ x[K]=y;
if(y==1)
{ for(int i=1;i<=k;i++) {MA[i]=M[i]; M[i]=max(M[i],v[K][i]);}
nr1++;
}
back(K+1);
if(y == 1)
{ for(int i=1;i<=k;i++) M[i] = MA[i];
nr1--;
}
}
}
}
int main()
{ int i,j;
f>>k>>s>>n;
for(i=0;i<n;i++)
for (j=1;j<=k;j++)
f>>v[i][j];
//D[i][j] = in cate moduri pot pune exact i bile identice in exact j cutii
//in cutia j pot pune 0 bile si atunci conteaza D[i][j-1] sau cel putin o bila
// caz in care bila i o pun in cutia j si atunci conteaza D[i-1][j]
for(j=0;j<=k+1;j++) d[0][j]=1;
for(i=1;i<=s+1;i++)
for(j=0;j<=k+1;j++)
if(j==1 || j==0) d[i][j]=1;
else if(i==1) d[i][j]=j;
else d[i][j] = (d[i-1][j]+d[i][j-1])%MOD;
back(0);
tot=d[s][k+1]-tot;
if(tot<0) tot+=MOD;
tot = tot - s * k - 1;
if(tot<0) tot+=MOD;
if(tot>=MOD) tot -= MOD;
g<<tot<<'\n'; g.close(); return 0;
}