Cod sursa(job #1000609)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 23 septembrie 2013 14:27:05
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.39 kb
#include<stdio.h>

#define maxn 23
#define maxk 31
#define maxS 10005
#define mod 3210121

FILE*f=fopen("cowfood.in","r");
FILE*g=fopen("cowfood.out","w");

int n,k,S,sol,puse;
int a[maxn][maxk],D[maxk][maxS],x[maxn],minim[maxn][maxk];

inline void dinamica () {
	
	for ( int j = 0 ; j <= S ; ++j ){
		D[0][j] = 1;
	}
	for ( int i = 1 ; i <= k ; ++i ){
		for ( int j = 0 ; j <= S ; ++j ){
			D[i][j] = D[i-1][j];
			if ( j > 0 ){
				D[i][j] += D[i][j-1];
				if ( D[i][j] >= mod )	D[i][j] -= mod;
			}
		}
	}
}

void back ( int niv ){
	
	if ( niv == n+1 ){
		if ( !puse )	return ;
		
		int sum = 0;
		for ( int j = 1 ; j <= k ; ++j ){
			sum += minim[puse][j];
		}
		int remaining = S-sum,r = 0;
		if ( remaining >= 0 ){
			r = D[k][remaining];
		}
		
		if ( puse & 1 ){
			sol += r;
			if ( sol >= mod )	sol -= mod;
		}
		else{
			sol -= r;
			if ( sol < 0 )	sol += mod;
		}
		
		return ;
	}
	
	back(niv+1);
	
	x[++puse] = niv;
	for ( int i = 1 ; i <= k ; ++i )	minim[puse][i] = minim[puse-1][i] > a[niv][i] ? minim[puse-1][i] : a[niv][i];
	back(niv+1);
	x[puse--] = 0;
}

int main () {
	
	fscanf(f,"%d %d %d",&k,&S,&n);
	for ( int i = 1 ; i <= n ; ++i ){
		for ( int j = 1 ; j <= k ; ++j ){
			fscanf(f,"%d",&a[i][j]);
		}
	}
	
	dinamica();
	back(1);
	
	sol = D[k][S] - sol; if ( sol < 0 )	sol += mod;
	sol = sol - S*k - 1; if ( sol < 0 )	sol += mod;
	fprintf(g,"%d\n",sol);
	
	fclose(f);
	fclose(g);
	
	return 0;
}