Cod sursa(job #376765)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 22 decembrie 2009 15:02:47
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <cstdio>

#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define max(a,b) (a>b?a:b)
#define mod 3210121

int P[32][32],A[32][1<<14],V[32][32],K,S,N;

void scan()
{
	freopen("cowfood.in","r",stdin);
	freopen("cowfood.out","w",stdout);
	scanf("%d%d%d",&K,&S,&N);
	
	FOR(i,1,N)
	FOR(j,1,K)
		scanf("%d",&V[i][j]);
}

int back(int p,int c)
{
	if(p == N+1)
	{
		int nr(0),sum = S;
		FOR(i,1,K) sum -= P[p][i];
		FOR(i,1,N) nr += (bool)(c & (1<<i));
		return sum < 0 ? 0 : A[K][sum] * (nr & 1 ? -1 : 1);
	}
	
	FOR(i,1,K) P[p+1][i] = P[p][i];
	int rez = back(p+1,c);
	
	FOR(i,1,K) P[p+1][i] = max(P[p][i],V[p][i]);
	
	return (rez + back(p+1,c | (1<<p))) % mod;
}

void solve()
{
	FOR(i,0,K) A[i][0] = 1;
	FOR(j,0,S) A[0][j] = 1;
	
	FOR(i,1,K)
	FOR(j,1,S)
		A[i][j] = (A[i-1][j] + A[i][j-1]) % mod;
	
	int rez = (back(1,0) - (K * S + 1)) % mod;
	printf("%d\n",rez < 0 ? rez + mod : rez);
}

int main()
{
	scan();
	solve();
	return 0;
}