Cod sursa(job #2647036)

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

#define NMAX 505
#define ll long long

int n,v[NMAX];

struct bigNR{
    int val[1005];
    int sz = 0;

    bigNR(){
        sz = 1;
    }

    void operator = (int x){
        sz = 0;
        if (x==0){
            val[++sz] = 0;
            return;
        }
        while (x){
            val[++sz] = x % 10;
            x/=10;
        }
    }

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

    friend ostream &operator << (ostream &output, bigNR &x){
        while (x.val[x.sz]==0) x.sz--;
        for (int i=x.sz;i>=1;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];
    }
    sort(v+1,v+n+1);
    for (int i=1;i<=n;i++){
        for (int j=1;j<=v[i];j++){
            DP[__gcd(j,v[i])] += DP[j];
        }
        bigNR aux;
        aux = 1;
        DP[v[i]] += aux;
    }

    if (DP[1].sz == 1 && DP[1].val[DP[1].sz] ==0)
        cout << 0 << '\n';
    else
        cout << DP[1] << '\n';

    return 0;
}