Cod sursa(job #1044257)

Utilizator Kira96Denis Mita Kira96 Data 29 noiembrie 2013 15:39:57
Problema Cowfood Scor 22
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<fstream>
#define nm 35
#define mod 3210121
#define N 11000
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
int a[nm][nm],nra,dim,x,s[nm],ma[nm][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;
}
void back(int lvl)
{
	if(lvl==n+1)
	{
		if(!t) return;
		nra=S;
		for(i=1;i<=k;++i)
			nra-=ma[lvl-1][i];
		if(nra>=0)
		{
			if(t&1)
			{
				sol-=SP[nra];
				if(sol<0)
					sol+=mod;
			}
			else
			{
				sol+=SP[nra];
				if(sol>=mod)
					sol-=mod;
			}
		}
		return;
	}
	back(lvl+1);
	t++;
	for(i=1;i<=k;++i)
		ma[lvl][i]=max(ma[lvl-1][i],a[lvl][i]);
	back(lvl+1);
	t--;
}
int main ()
{
	f>>k>>S>>n;
	P[1]=1;
	for(i=2;i<=S+k-1;++i)
		P[i]=P[i-1]*i%mod;
	for(i=1;i<=S+k-1;++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;
	}
	back(1);
	g<<sol;
	return 0;
}