Pagini recente » Cod sursa (job #3138041) | Cod sursa (job #555615) | Cod sursa (job #1637233) | Cod sursa (job #563030) | Cod sursa (job #473613)
Cod sursa(job #473613)
//principiul includerii si excluderii +
//generare de submultimi
#include <cstdio>
#include <iostream>
#define REST 3210121
#define DN 22
#define DK 32
using namespace std;
int k,s,n,
sir[DN][DK],p[DK][DK],
m[DK][1<<14];
int sb(int x,int y) {
int i;
if(x==n+1) {
int nr=0,suma=s;
for(i=1; i<=k; ++i) suma-=p[x][i];
for(i=1; i<=n; ++i) if(y & (1<<i)) ++nr;
if(suma<0) return 0;
else return m[k][suma]*(nr&1?-1:1);
}
for(i=1; i<=k; ++i) p[x+1][i]=p[x][i];
int sol;
sol=sb(x+1,y);
for(i=1; i<=k; ++i) p[x+1][i]=max(p[x][i],sir[x][i]);
return (sol+sb(x+1,y | (1<<x))) %REST;
}
void din() {
int i,j,sol;
for(i=0; i<=k; ++i) m[i][0]=1;
for(i=0; i<=s; ++i) m[0][i]=1;
for(i=1; i<=k; ++i) for(j=1; j<=s; ++j) m[i][j]=(m[i-1][j]+m[i][j-1])%REST;
sol=(sb(1,0)-k*s-1)%REST;
if(sol<0) printf("%d",sol+REST);
else printf("%d",sol);
}
int main()
{
freopen("cowfood.in","r",stdin);
freopen("cowfood.out","w",stdout);
scanf("%d %d %d",&k,&s,&n);
for (int i=1; i<=n; ++i) for(int j=1; j<=k; ++j) scanf("%d",&sir[i][j]);
din();
return 0;
}