Cod sursa(job #2868934)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 11 martie 2022 11:44:51
Problema Medie Scor 0
Compilator cpp-64 Status done
Runda dimineata_dulceata Marime 2.66 kb
#include <bits/stdc++.h>
#pragma GCC optimize ("Ofast")

using namespace std;

ifstream fin  ("coduri.in");
ofstream fout ("coduri.out");

const long long MAX_N = 30;

struct fractie{
    long long a;
    //  -
    long long b;
} f[MAX_N], check;

vector <long long> made[MAX_N], curr;

string aux, num, zec, per;
long long n, p, cod[MAX_N];

long long to_num(string temp){
    long long answer = 0;
    while(!temp.empty()){
        answer = answer * 10 + (temp[0] - '0');
        temp.erase(temp.begin());
    }
    return answer;
}

long long lgput(long long a, long long b){
    long long ans = 1;
    while(b){
        if(b&1)
            ans *= a;
        a *= a;
        b >>= 1;
    }
    return ans;
}

long long func9(long long x){
    long long ans = 0;
    while(x--)
        ans = ans * 10 + 9;
    return (ans == 0 ? 1 : ans);
}

signed main (){
    ios_base::sync_with_stdio(false);
    fin.tie(nullptr);
    fout.tie(nullptr);

    fin>>n;
    for(long long i=1; i<=n; i++){
        fin>>aux;
        string num = zec = per = "";

        for(p=0; p < (int)aux.size() && aux[p] != ','; p++) num += aux[p];
        for(++p; p < (int)aux.size() && aux[p] != '('; p++) zec += aux[p];
        for(++p; p < (int)aux.size() && aux[p] != ')'; p++) per += aux[p];

        f[i].a = to_num(num+zec+per) - ((int)per.size() > 0) * to_num(num+zec);
        f[i].b = func9((int)per.size()) * lgput(10, (int)zec.size());
    }

    for(long long mask=1; mask < (1 << n); mask++){
        if(__builtin_popcount(mask) == 1)
            continue;

        curr.clear();
        check = {1, 1};
        for(long long i=1; i<=n; i++)
            if(mask & (1 << (i-1))){
                check.a *= f[i].a;
                check.b *= f[i].b;
                curr.push_back(i);
            }

        for(long long i=1; i<=n; i++)
            if(f[i].a == check.a && f[i].b == check.b)
                made[i] = curr;
    }

    for(long long i=1; i<=n; i++){
        sort(made[i].begin(), made[i].end());
        made[i].resize(distance(made[i].begin(), unique(made[i].begin(), made[i].end())));
    }

    p = 1;
    for(long long i=1; i<=n; i++)
        if((long long)made[i].size() == 0){
            cod[i] = p;
            p *= 2;
        }

    for(long long i=1; i<=n; i++)
        if(!cod[i])
            for(auto m : made[i])
                cod[i] += cod[m];

    for(long long i=1; i<=n; i++){
        fout<<"18 ";
        for(long long j=0; j < 18; j++)
            if(cod[i]&(1<<j))
                fout<<"1 ";
            else
                fout<<"0 ";
        fout<<"\n";
    }
    return 0;
}