Cod sursa(job #906704)

Utilizator Marius96Marius Gavrilescu Marius96 Data 7 martie 2013 00:45:42
Problema Cowfood Scor 34
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include<cstdio>
#define MOD 3210121

//n+k-1 choose k

long long modpow (long long n, int e)
{
	if(!e)
		return 1;

	long long x=modpow (n,e/2);
	x=(x*x)%MOD;
	if(e%2)
		x=(x*n)%MOD;

	return x;
}

long long choose (long long n, long long k)
{
	if(n<k)
		return 0;

	long long a=1;
	long long b=1;

	for(int i=0;i<k;i++)
		a=(a*(n-i))%MOD, b=(b*(i+1))%MOD;

	return (a*modpow (b,MOD-2))%MOD;
}

long long calc (long long n, long long k)
{
	if(n<0)
		return 0;
	return choose (n+k-1, n);
}

int v[25][35];

int main (void)
{
	freopen ("cowfood.in","r",stdin);
#ifdef INFOARENA
	freopen ("cowfood.out","w",stdout);
#endif

	int k,s,n;
	scanf ("%d%d%d",&k,&s,&n);

	for(int i=0;i<n;i++)
		for(int j=0;j<k;j++)
			scanf ("%d",v[i]+j);

	long long ret=calc (s,k+1)-1-s*k;

	for(int i=1;i<1<<n;i++){
		int ss=s;
		for(int z=0;z<k;z++){
			int mx=0;
			for(int j=0;j<n;j++)
				if(i&(1<<j) && v[j][z]>mx)
					mx=v[j][z];
			ss-=mx;
		}
		if(__builtin_popcount (i)%2)
			ret-=calc (ss,k+1);
		else
			ret+=calc (ss,k+1);
	}

	printf ("%lld",ret);
	return 0;
}