Cod sursa(job #376731)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 22 decembrie 2009 13:39:34
Problema Cowfood Scor 2
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <cstdio>
#include <cstring>

#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define CP(v,w) memcpy((v),(w),sizeof((w)))
#define max(a,b) (a > b ? a : b)

#define IN  "cowfood.in"
#define OUT "cowfood.out"
#define mod 3210121

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

void scan()
{
	freopen(IN,"r",stdin);
	freopen(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 poz,int cfg)
{
	if(poz == K+1)
	{
		int nr(0),total = S;
		FOR(i,1,K)
			total -= Sp[poz][i],nr += cfg & (1<<i);
		return total < 0 ? 0 : total == S ? A[K][S] : (A[K][total] + 1) * (nr & 1 ? 1 : -1);
	}
	
	CP(Sp[poz+1],Sp[poz]);
	int rez = back(poz+1,cfg);
	
	FOR(i,1,K) 
		Sp[poz+1][i] = max(Sp[poz][i],V[poz][i]);
	
	rez += back(poz+1,cfg | (1<<poz));
	
	return rez % mod;
}

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

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