Cod sursa(job #3269771)

Utilizator GabrielPopescu21Silitra Gabriel - Ilie GabrielPopescu21 Data 20 ianuarie 2025 17:23:56
Problema Indep Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

struct baban {
    vector<int> v;
    const static int base = 1e9;
    baban () {}
    baban (int x) {
        v.clear();
        while (x) {
            v.push_back(x % base);
            x /= base;
        }
    }
    void normalize () {
        for (int i = 0; i < (int) v.size(); i++) {
            if (v[i] >= base) {
                if (i == (int) v.size() - 1) {
                    v.push_back(0);
                }
                v[i + 1] += v[i] / base;
                v[i] %= base;
            } else if (v[i] < 0) {
                v[i] += base;
                v[i + 1]--;
            }
        }
        while ((int) v.size() > 1 && v.back() == 0) {
            v.pop_back();
        }
    }
    baban operator + (const baban &other) {
        baban res;
        for (int i = 0; i < (int) max(other.v.size(), v.size()); i++) {
            int t = 0;
            if (i < (int) v.size()) {
                t += v[i];
            }
            if (i < (int) other.v.size()) {
                t += other.v[i];
            }
            res.v.push_back(t);
        }
        res.normalize();
        return res;
    }
    void operator += (const baban &other) {
        *this = *this + other;
    }
    friend ostream& operator << (ostream &output, const baban &v) {
        output << (v.v.empty() ? 0 : v.v.back());
        for (int i = (int) v.v.size() - 2; i >= 0; i--) {
            output << setw(9) << setfill('0') << v.v[i];
        }
        return output;
    }

};

const int MAX = 1005;
baban dp[MAX];

/**
 dp[i] - nr. de subsiruri cu cmmdc i
*/

int main()
{
    ifstream cin("indep.in");
    ofstream cout("indep.out");
    int n;
    cin >> n;

    for (int i = 1; i <= n; ++i)
    {
        int x;
        cin >> x;
        for (int j = 1; j <= 1000; ++j)
            dp[__gcd(x, j)] += dp[j];

        dp[x] = 1;
    }

    cout << dp[1];

    return 0;
}