Pagini recente » Cod sursa (job #1141114) | Cod sursa (job #286808) | Cod sursa (job #2253218) | Cod sursa (job #573938) | Cod sursa (job #174642)
Cod sursa(job #174642)
#include<stdio.h>
#include<string.h>
#define Km 31
#define Nm 20
#define Sm 10001
#define Mod 3210121
#define max(a,b) ((a)>(b)?(a):(b))
int A[Nm][Km],M[Km][Sm],V[Km],k,s,n,nr,ans;
void read()
{
int i,j;
freopen("cowfood.in","r",stdin);
scanf("%d%d%d",&k,&s,&n);
for(i=0;i<n;++i)
for(j=0;j<k;++j)
scanf("%d",&A[i][j]);
}
void back(int i)
{
int V0[Km],j,v=s;
if(i==n)
{
for(j=0;j<k;++j) v-=V[j];
if(v<0) return;
if(nr&1)
{
ans-=M[k][v];
if(ans<0) ans+=Mod;
}
else
{
ans+=M[k][v];
if(ans>=Mod) ans-=Mod;
}
return;
}
back(i+1);
++nr; memcpy(V0,V,sizeof(V));
for(j=0;j<k;++j)
V[j]=max(V[j],A[i][j]);
back(i+1);
--nr; memcpy(V,V0,sizeof(V));
}
void solve()
{
int i,j;
for(j=0;j<=s;++j)
M[1][j]=j+1;
for(i=2;i<=k;++i)
{
M[i][0]=1;
for(j=1;j<=s;++j)
M[i][j]=(M[i][j-1]+M[i-1][j])%Mod;
}
back(0);
ans-=k*s+1;
if(ans<0) ans+=Mod;
}
void write()
{
freopen("cowfood.out","w",stdout);
printf("%d\n",ans);
}
int main()
{
read();
solve();
write();
return 0;
}