Cod sursa(job #876496)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 11 februarie 2013 21:05:00
Problema Cowfood Scor 54
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<fstream>
#include<string.h>
#define mod 3210121
#define max_k 33
#define max_n 22
#define max_S 10010
using namespace std;

ifstream f("cowfood.in");
ofstream g("cowfood.out");

int i,j,V[max_k][max_S],C[max_n][max_k],p,nr,Fr[max_k],k,n,S,x,tot,sol;

int solve(){
	int A[max_k],sum=0;
	memset(A,0,sizeof(A));
	for(i=1;i<=n;i++){
		if(Fr[i]==1){
			for(j=1;j<=k;j++){
				if(C[i][j]>A[j])
					A[j]=C[i][j];
			}
		}
	}
	
	for(i=1;i<=k;i++)
		sum+=A[i];
	if(S-sum>=0)
		return V[k][S-sum];
	return 0;
}

int main(){
	
	f>>k>>S>>n;
	
	for(i=0;i<=S;i++)
		V[1][i]=i+1;
	for(i=2;i<=k;i++){
		for(j=0;j<=S;j++){
			V[i][j]=V[i-1][j];
			if(j!=0)
				V[i][j]+=V[i][j-1];
			if(V[i][j]>mod) V[i][j]-=mod;
		}
	}
	
	for(i=1;i<=n;i++){
		for(j=1;j<=k;j++)
			f>>C[i][j];
	}
	
	p=1;
	while(p<(1<<n)){
		memset(Fr,0,sizeof(Fr));nr=0;
		for(i=0;i<n;i++){
			if(((p>>i)&1)==1){
				nr++;
				Fr[i+1]=1;
			}
		}
		x=solve();
		if(nr%2==1)
			tot+=x;
		else
			tot-=x;
		
		if(tot<0)
			tot+=mod;
		else if(tot>=mod)
			tot-=mod;
		
		p+=1;
	}
	sol=V[k][S]-tot-S*k-1;
	while(sol<0)
		sol+=mod;
	g<<sol;
	
	return 0;
}