Cod sursa(job #466929)

Utilizator AndreyPAndrei Poenaru AndreyP Data 27 iunie 2010 22:29:18
Problema Prod Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <cstdio>
#include <cstring>
#define N 2010

int c[10];
int x[N],y[N],r[N];
int sum;

inline void citire()
{
	for(int i=1; i<10; ++i)
	{
		scanf("%d",&c[i]);
		sum+=c[i];
	}
	if(sum&1)
	{
		for(int i=1; i<10; ++i)
		{
			if(c[i])
			{
				++c[i];
				break;
			}
		}
	}
}

inline void mul(int a[N],int b[N],int c[N])
{
	memset(c,0,N*sizeof(int));
	
	int i,j,t;
	for(i=1; i<=a[0]; ++i)
	{
		t=0;
		for(j=1; j<=b[0] || t; ++j,t/=10)
		{
			t+=c[i+j-1]+a[i]*b[j];
			c[i+j-1]=t%10;
		}
		if(i+j-2>c[0])
			c[0]=i+j-2;
	}
}

inline void rezolva()
{
	int i1;
	if(sum&1)
		i1=((sum+1)>>1)+1;
	else
		i1=(sum>>1)+1;
	int i2=i1;
	int sum1=0;
	int aux;
	int cn=0;
	
	for(int i=9; i>0; --i)
	{
		if(c[i]==0)
			continue;
		if(sum1&1)
		{
			if(c[i]&1)
			{
				aux=c[i]>>1;
				++aux;
				if(i1<i2)
				{
					for(int j=0; j<aux; ++j)
						y[--i2]=i;
					for(int j=1; j<aux; ++j)
						x[--i1]=i;
				}
				else
				{
					for(int j=1; j<aux; ++j)
						y[--i2]=i;
					for(int j=0; j<aux; ++j)
						x[--i1]=i;
				}					
			}
			else
			{
				aux=c[i]>>1;
				if(i1<i2)
				{
					for(int j=0; j<=aux; ++j)
						y[--i2]=i;
					for(int j=1; j<aux; ++j)
						x[--i1]=i;
				}
				else
				{
					for(int j=1; j<aux; ++j)
						y[--i2]=i;
					for(int j=0; j<=aux; ++j)
						x[--i1]=i;
				}
			}
		}
		else
		{
			if(c[i]&1)
			{
				aux=c[i]>>1;
				if(cn==0)
				{
					for(int j=0; j<=aux; ++j)
						x[--i1]=i;
					for(int j=0; j<aux; ++j)
						y[--i2]=i;
				}
				else
				{
					for(int j=0; j<aux; ++j)
						x[--i1]=i;
					for(int j=0; j<=aux; ++j)
						y[--i2]=i;
				}
				cn^=1;
			}
			else
			{
				aux=c[i]>>1;
				for(int j=0; j<aux; ++j)
					x[--i1]=y[--i2]=i;
			}
		}
		sum1+=c[i];
	}
	
	if(sum&1)
		x[1]=0;
	
	if(sum&1)
		x[0]=y[0]=((sum+1)>>1);
	else
		x[0]=y[0]=(sum>>1);
	mul(x,y,r);
	if(sum&1)
	{
		for(int i=r[0]; i>1; --i)
			printf("%d",r[i]);
	}
	else
	{
		for(int i=r[0]; i>0; --i)
			printf("%d",r[i]);
	}	
	printf("\n");
}

int main()
{
	freopen("prod.in","r",stdin);
	freopen("prod.out","w",stdout);
	
	citire();
	rezolva();
	
	return 0;
}