Cod sursa(job #1952804)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 4 aprilie 2017 13:18:05
Problema Cowfood Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <bits/stdc++.h>
#define pb push_back
#define NMAX 35
#define ll long long
#define x first
#define y second
#define INF 0x3f3f3f3f
#define MOD 3210121

using namespace std;

ifstream fin("cowfood.in");
ofstream fout("cowfood.out");

int dp[35][10100],n,k,s,ans;
int v[35][35],act[35],aux[35][35];

inline void pinex(int level, int exp) {
	if(level>=n){
		int sum=0;
		for(int i=0; i<k; i++)
			sum+=act[i];

		if(sum<=s && exp>0){
			if(exp&1){
				ans+=dp[k+1][s-sum];
				if(ans>=MOD) ans-=MOD;
			}
			else {
				ans-=dp[k+1][s-sum];
				if(ans<0) ans+=MOD;
			}
		}

		return;
	}

	pinex(level+1,exp);
	int i;
	for(i=1;i<=k;++i){
		aux[level][i]=act[i];
		act[i]=max(act[i], v[level][i]);
	}

	pinex(level+1,exp+1);
	for(i=1;i<=k;++i)
		act[i]=aux[level][i];
}

int main() {
	int i,j;

	fin>>k>>s>>n;

	for(i=1;i<=n;++i)
		for(j=1;j<=k;++j) fin>>v[i][j];

	for(i=1;i<10005;++i){
		for(j=0;j<35;++j){
			if(j==0 || j==1) dp[j][i]=1;
			else dp[j][i]=(dp[j-1][i]+dp[j][i-1])%MOD;
		}
	}

	pinex(0,1);
	fout<<(dp[k+1][s]-ans-k*s-1+2*MOD)%MOD;

	return 0;
}