Cod sursa(job #1016249)

Utilizator nicuvladNicu Vlad nicuvlad Data 25 octombrie 2013 22:37:14
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MOD 3210121
using namespace std;

int c[10101][31], a[21][31], maxs[21][31], sum[10101];
int n, k, s;
long long sol;

void init()
{
	int i, j;
	for(i=0;i<10101;i++)
	{
		c[i][0]=1;
		for(j=1;j<=min(i, 30);j++)
		{
			c[i][j]=(c[i-1][j-1]+c[i-1][j])%MOD;
		}
	}
	sum[0]=1;
	for(i=1;i<=s;i++) 
	{
		sum[i]=(c[i+k-1][k-1]+sum[i-1])%MOD;
	}
}

void bt(int poz, int sign)
{
	int i;
	if(poz==n+1)
	{
		int s1=s;
		for(i=1;i<=k;i++)
		{
			s1-=maxs[poz-1][i];
		}
		if(s1>=0) sol=(sol+MOD+sum[s1]*sign)%MOD;
	}
	else
	{
		for(i=1;i<=k;i++) maxs[poz][i]=maxs[poz-1][i];
		bt(poz+1, sign);
		for(i=1;i<=k;i++) maxs[poz][i]=max(maxs[poz-1][i], a[poz][i]);
		bt(poz+1, -sign);
	}
}

int main()
{
	freopen("cowfood.in", "r", stdin);
	freopen("cowfood.out", "w", stdout);
	int i, j;
	scanf("%d%d%d", &k, &s, &n);
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=k;j++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	init();
	sol=(MOD*2-s*k-1)%MOD;
	bt(1, 1);
	printf("%lld", sol);
}