Cod sursa(job #1488601)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 19 septembrie 2015 12:04:14
Problema Prod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <bits/stdc++.h>

using namespace std;

const int NUM_DIGS = 10;
const int MAX_DIGS = 10005;

int frecv[NUM_DIGS];
int h[2][MAX_DIGS + 1];
int prod[3 * MAX_DIGS];

int main()
{
    ifstream in("prod.in");
    ofstream out("prod.out");
    bool line;
    int t, q;

    for (int i = 1; i < 10; i++)
        in >> frecv[i];
    line = 0;
    for (int i = 9; i >= 1; i--)
    {
        while (frecv[i]--)
        {
            h[line][++h[line][0]] = i;
            if (h[line][0] > h[line ^ 1][0])
                line ^= 1;
            else if (h[line][0] == h[line ^ 1][0])
            {
                int j = 1;
                while ((j <= h[line][0]) && (h[0][j] == h[1][j]))
                    j++;
                if (j <= h[line][0])
                    line ^= (h[line][j] > h[line ^ 1][j]);
            }
        }
    }

    reverse(h[0] + 1, h[0] + h[0][0] + 1);
    reverse(h[1] + 1, h[1] + h[1][0] + 1);

    prod[0] = h[1][0] + h[0][0] - 1;
    for (int i = 1; i <= h[0][0]; i++)
    {
        for (int j = 1; j <= h[1][0]; j++)
            prod[i + j - 1] += h[0][i] * h[1][j];
        t = 0;
        for (int j = 1; j <= prod[0]; j++)
        {
            t += prod[j];
            q = t / 10;
            prod[j] = t - (q << 1) - (q << 3);
            t = q;
        }
        if (t)
            prod[++prod[0]] = t;
    }

    for (int i = prod[0]; i > 0; i--)
        out << prod[i];
    out << '\n';
    out.close();
    return 0;
}