Cod sursa(job #993198)

Utilizator mitrutstrutMitrea Andrei Ionut mitrutstrut Data 3 septembrie 2013 14:41:50
Problema Prod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 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;
}