Cod sursa(job #369857)

Utilizator victor.ionescuIonescu Victor Cristian victor.ionescu Data 29 noiembrie 2009 17:45:57
Problema Plus Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fi("plus.in");
ofstream fo("plus.out");
vector<int> v[3];
int S,tip1,tip2,tip3,nr1,nr2,nr3,sm1,s0,s1;

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

long long pos2(int x,int y,int sum){
	if (sum>(x+y)) return 0;
	int lmin=max(0,sum-y),lmax=min(x,sum);
	return (long long)(lmax-lmin+1); 
}

long long nrp(vector<int> v,int sum){
	if (v.size()==0){
		if (sum==0) return 1; else return 0;
	} else 
	if (v.size()==1) return 1; else
		if (v.size()==2) return pos2(v[0],v[1],sum); else {
			long long rez=0;
			int limita=min(v[0],sum);
			for (int i=0;i<=limita;++i) rez+=pos2(v[1],v[2],sum-i);
			return rez;
		}
}

int main(){
	fi>>S;
	fi>>nr1>>tip1>>nr2>>tip2>>nr3>>tip3;
	v[tip1+1].push_back(nr1);
	v[tip2+1].push_back(nr2);
	v[tip3+1].push_back(nr3);
	s1=sm1=s0=0;
	long long rez=0;
	for (unsigned int i=0;i<v[0].size();++i) sm1+=v[0][i];
	for (unsigned int i=0;i<v[1].size();++i) s0+=v[1][i];
	for (unsigned int i=0;i<v[2].size();++i) s1+=v[2][i];
	for (int i=S;i<=s1;++i){
		int nrm1=i-S;
		if (nrm1<=sm1){
			long long parts=nrp(v[0],nrm1);
			parts*=nrp(v[2],i);
			rez+=parts;
		}
	}
	for (unsigned int i=0;i<v[1].size();++i) rez*=(long long)(v[1][i]+1);
	fo<<rez<<"\n";
	return 0;
}