Cod sursa(job #473613)

Utilizator S7012MYPetru Trimbitas S7012MY Data 30 iulie 2010 16:13:07
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.09 kb
//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;
}