Cod sursa(job #515230)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 20 decembrie 2010 19:13:36
Problema Prod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define Nmax 1005
#define Cmax 502

using namespace std;

int v[Nmax],a[2][Cmax],c[Nmax];
int N;

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

int main(){
    int i,nr,st,m;
    freopen("prod.in","r",stdin);
    freopen("prod.out","w",stdout);
    for(i=1;i<10;++i){
        scanf("%d",&nr); N+=nr;
        while( nr ) v[++v[0]]=i, nr--;
    }
    reverse(v+1,v+N+1);

    st=0; m=0;
    for(i=1; i+1<=N; ){
        a[st][++m]=v[i++];
        a[st^1][m]=v[i++];
        if( !st && a[0][m] != a[1][m] )
            st^=1;
    }

    a[0][0]=a[1][0]=m;
    if(N & 1){
        for(i=1; a[0][i] == a[1][i]; ) ++i;
        if( a[0][i] < a[1][i] ) a[0][++a[0][0]]=v[N];
        else a[1][++a[1][0]]=v[N];
    }

    reverse(a[0]+1,a[0]+a[0][0]+1);
    reverse(a[1]+1,a[1]+a[1][0]+1);
    mul(a[0],a[1]);

    for(i=c[0]; i>=1; --i) printf("%d",c[i]);
    fclose(stdin); fclose(stdout);
    return 0;
}