Cod sursa(job #471256)

Utilizator piekarskaAnna Piekarska piekarska Data 17 iulie 2010 23:45:44
Problema Prod Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#include <cstring>
#define MAXN 1024
using namespace std;
int ncif[10];
int fn[MAXN],sn[MAXN],Lf,Ls;
int cifre[MAXN];

int final[MAXN*3];

void reverse_vec(int* v){

	for (int i=1;i<=(v[0]/2);++i){
		int aux=v[i];
		v[i]=v[v[0]-i+1];
		v[v[0]-i+1]=aux;
	}
}

void add_vec(int *v,int depla,int K){

	for (int i=1;i<=v[0];++i)
		final[i+depla]+=K*v[i];
}

void do_prod(){
	memset(final,0,sizeof(final));
	for (int i=1;i<=sn[0];++i)
		add_vec(fn,i-1,sn[i]);

	final[0]=sn[0]+fn[0]-1;

	int t=0;

	for (int i=1;i<=final[0];++i){
		int x=final[i]+t;
		final[i]=x%10;
		t=x/10;
	}

	while (t){
		final[++final[0]]=t%10;
		t/=10;
	}

}


int main(){

	freopen("prod.in","r",stdin);
	freopen("prod.out","w",stdout);

	for (int i=1;i<=9;++i) scanf("%d",&ncif[i]);
	

	fclose(stdin);

	int greater=0;

	int tcif=0;

	for (int i=9;i>=1;--i)
		for (int j=1;j<=ncif[i];++j)
			cifre[++tcif]=i;

	int ind=1;
	cifre[tcif+1]=0;

	Lf=Ls=0;

	while (ind<=tcif){

		int c1=cifre[ind];
		int c2=cifre[ind+1];
		ind+=2;

		if (c1>c2){
			if (greater==0){
				fn[++Lf]=c1;
				greater=1;
				if (c2!=0) sn[++Ls]=c2;
				greater=1;
			} else {
				sn[++Ls]=c1;
				if (c2!=0) fn[++Lf]=c1;
			}
		} else {
			fn[++Lf]=c1;
			sn[++Ls]=c2;
		}
	}

	fn[0]=Lf;
	sn[0]=Ls;

	reverse_vec(fn);
	reverse_vec(sn);

	do_prod();

	for (int i=final[0];i>=1;--i)
		printf("%d",final[i]);

	printf("\n");


	fclose(stdout);

	return 0;
}