Cod sursa(job #660341)

Utilizator crushackPopescu Silviu crushack Data 12 ianuarie 2012 15:12:17
Problema Cowfood Scor 2
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.56 kb
#include <stdio.h>
#include <string.h>
#define NMax 32
#define KMax 32
#define SMax 10010

const char IN[]="cowfood.in",OUT[]="cowfood.out";
const int mod = 3210121;

int N,S,K,Rez;
int v[NMax][KMax];
int aux[NMax];
int T[SMax];

inline int max(int x,int y){
	return x>y ? x : y;
}

int add(int *st)
{
	int s=0;
	for (int i=1;i<=N;++i) s+=st[i];
	if ( s>S ) return 0;
	return T[ S - s ];
}

int nrbits(int x){
	int ret=0;
	while (x){
		++ret;
		x&=(x-1);
	}
	return ret;
}

void bkt()
{
	int i,j,k;
	
	for (i=1;i<(1<<N);++i)
	{
		memset(aux,0,sizeof(aux));
		for (j=0;j<N;++j) if ( i&(1<<j) )
			for (k=1;k<=N;++k)
				aux[k]=max(v[j+1][k],aux[k]);
		if (nrbits(i)&1)
			Rez+=add(aux);
		else
			Rez+=mod-add(aux);
		while (Rez>=mod) Rez-=mod;
	}
	
	/*if (k>N) return;
	
	for (i=k;i<=N;++i)
	{
		for (j=1;j<=K;++j)
			st[p+1][j]=max(st[p][j],v[i][j]);
		Rez+= (p&1) ? add(p+1) : mod-add(p+1);
		if (Rez>=mod) Rez-=mod;
		if (Rez<0) Rez+=mod;
		bkt(i+1,p+1);
	}*/
}

int pow(int x,int p,int mod){
	int sol=1,i;
	for (i=0;(1<<i)<=p;++i)
	{
		if ( (1<<i)&p )
			sol= sol*x%mod;
		x= x*x%mod;
	}
	return sol;
}

int main()
{
	int i,j;
	freopen(IN,"r",stdin);
	scanf("%d%d%d",&K,&S,&N);
	for (i=1;i<=N;++i)
		for (j=1;j<=K;++j)
			scanf("%d",&v[i][j]);
	fclose(stdin);
	
	for ( i=1;i<=S;++i) T[i]=T[i-1]+1;
	for ( i=2;i<=K;++i)
		for (i=1;i<=S;++i)
			T[i]+=T[i-1],
			(T[i]>=mod) ? T[i]-=mod : 0 ;
	
	bkt();
	
	freopen(OUT,"w",stdout);
	printf("%d\n",(T[S-2]-Rez+mod)%mod);
	fclose(stdout);
	
	return 0;
}