Cod sursa(job #2705241)

Utilizator gasparrobert95Gaspar Robert Andrei gasparrobert95 Data 12 februarie 2021 11:12:26
Problema Indep Scor 95
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>
#define ll long long
#define base 100000000
using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");
int n, el;
vector <int> pd[2][1005];

void aduna(vector <int> &a, vector <int> b) {
    if (a.size() < b.size())
        swap(a, b);
    for (int i = 0; i < a.size(); ++i) {
        if (i < b.size())
            a[i] += b[i];
        if (a[i] >= base) {
            if (i + 1 >= a.size())
                a.push_back(1);
            else
                ++a[i + 1];
            a[i] -= base;
        }
    }
    return;
}

int main() {
    fin >> n;
    bool turn = false;
    for (int i = 1; i <= n; ++i) {
        fin >> el;
        for (int j = 1; j <= 1000; ++j)
            pd[turn][j].clear();
        for (int j = 1; j <= 1000; ++j) {
            int c = __gcd(el, j);
            if (pd[turn][c].empty())
                pd[turn][j] = pd[!turn][j];
            else
                aduna(pd[turn][j], pd[!turn][j]);
            aduna(pd[turn][c], pd[!turn][j]);
        }
        if (pd[turn][el].empty())
            pd[turn][el] = {1};
        else
            aduna(pd[turn][el], {1});
        turn = !turn;
    }
    for (int i = pd[!turn][1].size() - 1; i >= 0; --i) {
        if (i < pd[!turn][1].size() - 1) {
            ll nr = pd[!turn][1][i];
            while (nr * 10 < base)
                fout << 0, nr *= 10;
        }
        fout << pd[!turn][1][i];
    }
    return 0;
}