Cod sursa(job #2647015)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 2 septembrie 2020 18:16:34
Problema Indep Scor 75
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <bits/stdc++.h>
using namespace std;

#define NMAX 505
#define ll long long

int n,v[NMAX];

struct bigNR{
    vector<int> val;

    bigNR(){
        val.clear();
        val.push_back(0);
    }

    void operator = (int x){
        val.clear();
        if (x==0){
            val.push_back(0);
            return;
        }
        while (x){
            val.push_back(x%10);
            x/=10;
        }
    }

    void operator *= (int x){
        int t = 0;
        for (int i=0;i<val.size();i++){
            t += val[i]*x;
            val[i] = t%10;
            t /= 10;
        }
        while (t){
            val.push_back(t % 10);
            t /= 10;
        }
    }

    bigNR operator * (const int &oth) const{
        bigNR ans;
        ans = *this;
        ans *= oth;
        return ans;
    }

    void operator += (const bigNR &oth){
        int i = 0, t = 0;
        for (i=0;i<max(oth.val.size(),val.size());i++){
            t += (i < val.size() ? val[i] : 0) + (i < oth.val.size() ? oth.val[i] : 0);
            if (i >= val.size()) val.push_back(0);
            val[i] = t % 10;
            t /= 10;
        }
        while (t!=0){
            if (i >= val.size()) val.push_back(0);
            val[i++] = t % 10;
            t /= 10;
        }
    }

    bigNR operator + (const bigNR &oth) const{
        bigNR ans;
        ans = *this;
        ans += oth;
        return ans;
    }

    friend ostream &operator << (ostream &output, bigNR &x){
        while (x.val.back()==0) x.val.pop_back();
        for (int i=x.val.size()-1;i>=0;i--) output << x.val[i];
        return output;
    }
} DP[1001];

int main()
{
    freopen("indep.in","r",stdin);
    freopen("indep.out","w",stdout);

    cin >> n;
    for (int i=1;i<=n;i++){
        cin >> v[i];
        for (int j=1;j<=1000;j++){
            DP[__gcd(j,v[i])] += DP[j];
        }
        bigNR aux;
        aux = 1;
        DP[v[i]] += aux;
    }

    cout << DP[1] << '\n';

    return 0;
}