Cod sursa(job #2006715)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 31 iulie 2017 13:17:59
Problema Prod Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>

int fr[10];

std::vector <int> a, b;

inline bool cmp() {
    if(a.size() > b.size())
        return 0;
    if(a.size() < b.size())
        return 1;
    int i = a.size() - 1;
    while(i >= 0 && a[i] == b[i])
        i--;
    if(i == -1)
        return 1;
    return a[i] < b[i];
}

inline std::vector <int> multiply(std::vector <int> a, std::vector <int> b) {
    std::vector <int> c;
    for(int i = 0; i < a.size(); i++) {
        int t = 0;
        for(int j = 0; j < b.size() || t > 0; j++) {
            if(c.size() <= i + j)
               c.push_back(0);
            if(j < b.size())
                t += a[i] * b[j] + c[i + j];
            else
                t += c[i + j];
            c[i + j] = t % 10;
            t /= 10;
        }
    }
    if(c.empty())
        c.push_back(0);
    return c;
}

int main() {
    FILE *fi, *fout;
    int i;
    fi = fopen("prod.in" ,"r");
    fout = fopen("prod.out" ,"w");
    for(i = 1; i < 10; i++)
        fscanf(fi,"%d " ,&fr[i]);
    for(i = 9; i > 0; i--) {
        while(fr[i] > 0) {
            fr[i]--;
            if(cmp() == 1)
                a.push_back(i);
            else
                b.push_back(i);
            fr[i]--;
        }
    }
    for(i = 0; i < a.size() - i - 1; i++)
        std::swap(a[i], a[a.size() - i - 1]);
    for(i = 0; i < b.size() - i - 1; i++)
        std::swap(b[i], b[b.size() - i - 1]);
    a = multiply(a, b);
    for(i = a.size() - 1; i >= 0; i--)
        fprintf(fout,"%d" ,a[i]);
    fclose(fi);
    fclose(fout);
    return 0;
}