Cod sursa(job #3347562)

Utilizator AlexandruCorneaCornea Alexandru Mihai AlexandruCornea Data 17 martie 2026 11:33:46
Problema Indep Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <bits/stdc++.h>
using namespace std;

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

struct Big
{
    vector<int> c;

    Big(int x=0)
    {
        if(x==0)
            return;
        while(x)
        {
            c.push_back(x%10);
            x/=10;
        }
    }
};

int cmmdc(int a,int b)
{
    while(b)
    {
        int r=a%b;
        a=b;
        b=r;
    }
    return a;
}

Big aduna(Big a,const Big &b)
{
    int t=0;
    int n=max((int)a.c.size(),(int)b.c.size());
    if((int)a.c.size()<n)
        a.c.resize(n,0);

    for(int i=0; i<n; i++)
    {
        int s=a.c[i]+t;
        if(i<(int)b.c.size())
            s+=b.c[i];
        a.c[i]=s%10;
        t=s/10;
    }

    while(t)
    {
        a.c.push_back(t%10);
        t/=10;
    }

    return a;
}

bool zero(const Big &x)
{
    return x.c.empty();
}

void scrie(const Big &x)
{
    if(x.c.empty())
    {
        fout<<0;
        return;
    }

    for(int i=(int)x.c.size()-1; i>=0; i--)
        fout<<x.c[i];
}

int main()
{
    int n;
    fin>>n;

    vector<Big> dp(1001),nou(1001);

    for(int i=1; i<=n; i++)
    {
        int x;
        fin>>x;

        nou=dp;
        nou[x]=aduna(nou[x],Big(1));

        for(int g=1; g<=1000; g++)
        {
            if(zero(dp[g]))
                continue;

            int d=cmmdc(g,x);
            nou[d]=aduna(nou[d],dp[g]);
        }

        dp=nou;
    }

    scrie(dp[1]);
    return 0;
}