Cod sursa(job #962685)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 15 iunie 2013 15:44:54
Problema Prod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include<stdio.h>
#include<algorithm>

#define alfa 10
#define maxcif 1005

using namespace std;

FILE*f=fopen("prod.in","r");
FILE*g=fopen("prod.out","w");

int fr[alfa],N[2][maxcif],sol[maxcif<<1];

inline int get_min ( int *A , int *B ){
	
	if ( A[0] < B[0] )	return 0;
	if ( A[0] > B[0] )	return 1;
	
	for ( int i = 1 ; i <= A[0] ; ++i ){
		if ( A[i] < B[i] )	return 0;
		if ( A[i] > B[i] )	return 1;
	}
	return 0;
}

inline void mult ( int *A , int *B , int *C ){
	
	C[0] = A[0]+B[0]-1;
	for ( int i = 1 ; i <= A[0] ; ++i ){
		for ( int j = 1 ; j <= B[0] ; ++j ){
			C[i+j-1] += A[i]*B[j];
		}
	}
	
	int T = 0;
	for ( int i = 1 ; i <= C[0] ; ++i ){
		C[i] += T;
		T = C[i]/10;
		C[i] %= 10;
	}
	if ( T )	C[++C[0]] = T;
}

int main () {
	
	for ( int i = 1 ; i < alfa ; ++i ){
		fscanf(f,"%d",&fr[i]);
	}
	
	for ( int i = alfa-1 ; i >= 1 ; --i ){
		
		for ( int j = 1 ; j <= fr[i] ; ++j ){
			
			int where = get_min(N[0],N[1]);
			N[where][++N[where][0]] = i;
		}
	}
	
	reverse(N[0]+1,N[0]+N[0][0]+1);
	reverse(N[1]+1,N[1]+N[1][0]+1);
	
	mult(N[0],N[1],sol);
	
	for ( int i = sol[0] ; i >= 1 ; --i ){
		
		fprintf(g,"%d",sol[i]);
	}
	fprintf(g,"\n");
	
	fclose(f);
	fclose(g);
	
	return 0;
}