Cod sursa(job #467423)

Utilizator ProtomanAndrei Purice Protoman Data 28 iunie 2010 21:15:48
Problema Prod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <string.h>

#define MAX 2048
#define bazaNum 10
#define ll long long
#define pb push_back

using namespace std;

int cant[16];
int x[MAX], y[MAX];
vector <int> vctEl;

inline void inmulteste(int *nrmProd, int nrmFact[])
{
    int t = 0;
    int nrmTemp[MAX];
    memset(nrmTemp, 0, sizeof(nrmTemp));

    for (int i = 1; i <= nrmProd[0]; i++)
        for (int j = 1; j <= nrmFact[0] || t; j++, t /= bazaNum)
        {
            nrmTemp[i + j - 1] = (t += nrmTemp[i + j - 1] + nrmProd[i] * nrmFact[j]) % bazaNum;

            if (i + j - 1 > nrmTemp[0])
                nrmTemp[0] = i + j - 1;
        }

    for (int i = 0; i <= nrmTemp[0]; i++)
        nrmProd[i] = nrmTemp[i];
}

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

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

    int dp = 0;
    for (int i = 9; i; i--)
        for (int j = 1; j <= cant[i]; j++)
            vctEl.pb(i);

    for (int i = 0; i < vctEl.size(); i++)
        if (dp)
        {
            y[++y[0]] = vctEl[i];
            i++;
            if (i < vctEl.size())
                x[++x[0]] = vctEl[i];
        }
        else
        {
            x[++x[0]] = vctEl[i];
            i++;
            if (i < vctEl.size())
            {
                if (vctEl[i] != vctEl[i - 1])
                    dp++;
                y[++y[0]] = vctEl[i];
            }
        }

    reverse(x + 1, x + 1 + x[0]);
    reverse(y + 1, y + 1 + y[0]);

    inmulteste(x, y);

    for (int i = x[0]; i; i--)
        printf("%d", x[i]);
    printf("\n");

    fclose(stdin);
    fclose(stdout);
    return 0;
}