Cod sursa(job #466712)

Utilizator mottyMatei-Dan Epure motty Data 27 iunie 2010 13:35:20
Problema Prod Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 1 Marime 1.6 kb
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<deque>
#define dechiu deque
using namespace std;

const int N=2000;

dechiu <int> q;

int nr[2][N],C[N];

void mul(int A[], int B[])
{
      int i, j, t;
      memset(C, 0, sizeof(C));
      for (i = 1; i <= A[0]; i++)
      {
              for (t=0, j=1; 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;
      }
      memcpy(A, C, sizeof(C));
}

void Read(){
    int x;
    for( int i=1; i<=9; ++i){
        scanf("%d",&x);
        while(x--)
            q.push_front(i);
    }
}

void Solve(){
    int prior=0, up, down, a, b;
    while(!q.empty()){
        up=prior%2;
        down=up^1;

        a=q.front();
        q.pop_front();
        nr[up][++nr[up][0]]=a;
        if(!q.empty()){
            b=q.front();
            q.pop_front();
            nr[down][++nr[down][0]]=b;
        }

        if(a!=b)
            prior++;
    }
}

void Print(){
    for( int i=nr[0][0]; i; --i)
        printf("%d",nr[0][i]);
}

void SwapNums(){
    int aux,nnn=nr[0][0];
    for( int i=1; i<=nnn/2; ++i){
        aux=nr[0][i];
        nr[0][i]=nr[0][nnn-i+1];
        nr[0][nnn-i+1]=aux;
    }
    nnn=nr[1][0];
    for( int i=1; i<=nnn/2; ++i){
        aux=nr[1][i];
        nr[1][i]=nr[1][nnn-i+1];
        nr[1][nnn-i+1]=aux;
    }
}

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

	Read();

	Solve();

    SwapNums();

    mul(nr[0],nr[1]);

	Print();

	return 0;
}