Cod sursa(job #136958)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 16 februarie 2008 17:51:53
Problema Plus Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<stdio.h>
long long int i,s,a,b,c,u,v,w,cc[300010],aux,sol;
void solve3();void solve2();void solve1();void solve0();
int main()
{
	FILE *f,*g;f=fopen("plus.in","r");g=fopen("plus.out","w");
	fscanf(f,"%lld",&s);
	fscanf(f,"%lld%lld",&a,&u);
	fscanf(f,"%lld%lld",&b,&v);
	fscanf(f,"%lld%lld",&c,&w);
	if(u==-1){s+=a;u=1;}
	if(v==-1){s+=b;v=1;}
	if(w==-1){s+=c;w=1;}
	if(u+v+w==3)
	{solve3();fprintf(g,"%lld\n",sol);fcloseall();return 0;}
	if(u+v+w==2)
	{if(!u){aux=a;a=c;c=aux;u=1;w=0;}
	 if(!v){aux=b;b=c;c=aux;v=1;w=0;}
	 solve2();fprintf(g,"%lld\n",sol);fcloseall();return 0;
	}
	if(u+v+w==1)
	{if(v){aux=a;a=b;b=aux;u=1;v=0;}
	 if(w){aux=a;a=c;c=aux;u=1;v=0;}
	 solve1();fprintf(g,"%lld\n",sol);fcloseall();return 0;
	}
	solve0();fprintf(g,"%lld\n",sol);fcloseall();return 0;
}
void solve0()
{
	if(s==0) sol=(a+1)*(b+1)*(c+1);
}
void solve1()
{
	if(s<=a) sol=(b+1)*(c+1);
}
void solve2()
{      if(s>a+b){sol=0;return;}
       cc[a+b+2]++;cc[a+1]--;cc[b+1]--;cc[0]++;
       for(i=a+b+2;i>=2;i--)
       { cc[i-1]+=2*cc[i];
	 cc[i-2]-=cc[i];
       }
       sol=cc[s+2]*(c+1);
}
void solve3()
{       if(s>a+b+c){sol=0;return;}
	cc[a+b+c+3]++;cc[a+b+2]--;cc[a+c+2]--;cc[b+c+2]--;
	cc[a+1]++;cc[b+1]++;cc[c+1]++;cc[0]--;
	for(i=a+b+c+3;i>=3;i--)
	{ cc[i-1]+=3*cc[i];cc[i-2]-=3*cc[i];cc[i-3]+=cc[i];}
	sol=cc[s+3];
}