Cod sursa(job #1044245)

Utilizator Kira96Denis Mita Kira96 Data 29 noiembrie 2013 15:21:03
Problema Cowfood Scor 54
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<fstream>
#define nm 35
#define mod 3210121
#define N 11000
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
int ma[nm],a[nm][nm],nra,dim,x,s[nm],e,i,j,S,k,n,t;
long long P[N],I[N],sol,SO[N],SP[N];
long long rise(long long x,int po)
{
	long long so=1;
	while(po)
	{
		if(po&1)
		{
			so*=x;
			so%=mod;
		}
		x=(x*x)%mod;
		po>>=1;
	}
	return so;
}
int main ()
{
	f>>k>>S>>n;
	P[1]=1;
	for(i=2;i<=S+k+2;++i)
		P[i]=P[i-1]*i%mod;
	for(i=1;i<=S+k+2;++i)
		I[i]=rise(P[i],mod-2);
	dim=(1<<n);
	for(i=1;i<=n;++i)
		for(j=1;j<=k;++j)
			f>>a[i][j];
	SO[0]=1;
	SO[1]=1LL*P[k]*I[k-1]%mod*I[1]%mod;
	for(i=2;i<=S;++i)
	{
		SO[i]=1LL*P[i+k-1]*I[k-1]%mod*I[i]%mod;
		sol+=SO[i]-k;
		if(sol>mod)
			sol-=mod;
	}
	SP[0]=1;
	for(i=1;i<=S;++i)
	{
		SP[i]=SP[i-1]+SO[i];
		if(SP[i]>=mod)
			SP[i]-=mod;
	}
	for(i=1;i<dim;++i)
	{
		t=0;
		for(x=i,j=1;x;j++,(x>>=1))
			if(x&1)
				s[++t]=j;
		for(j=1;j<=t;++j)
			for(e=1;e<=k;++e)
				ma[e]=max(ma[e],a[s[j]][e]);
		nra=S;
		for(j=1;j<=k;++j)
		{
			nra-=ma[j];
			ma[j]=0;
		}
		if(nra<=0)
			continue;
		if(t&1)
		{
			sol-=SP[nra];
			while(sol<0)
				sol+=mod;
		}
		else
		{
			sol+=SP[nra];
			while(sol>=mod)
				sol-=mod;
		}
	}
	g<<sol;
	return 0;
}