Cod sursa(job #3176814)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 27 noiembrie 2023 20:06:06
Problema Indep Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <bits/stdc++.h>

#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

///#include <tryhardmode>
///#include <GODMODE::ON>

using namespace std;

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

const int NMAX=1e3+5;
int v[NMAX];

struct Huge{
    int digits[200];

    void reset()
    {
        for(int i=1;i<=digits[0];i++)
            digits[i]=0;
        digits[0]=0;
    }

    void add_num(int val)
    {
        int kon=val;
        for(int i=1;i<=digits[0];i++)
        {
            digits[i]=digits[i]+kon;
            kon=digits[i]/10;
            digits[i]%=10;
        }
        while(kon)
        {
            digits[++digits[0]]=kon%10;
            kon/=10;
        }
    }

    add_huge(const Huge &other)
    {
        int kon=0;
        digits[0]=max(digits[0],other.digits[0]);
        for(int i=1;i<=digits[0];i++)
        {
            digits[i]=digits[i]+other.digits[i]+kon;
            kon=digits[i]/10;
            digits[i]=digits[i]%10;
        }
        while(kon)
        {
            digits[++digits[0]]=kon%10;
            kon/=10;
        }
    }

    void print()
    {
        if(digits[0]==0)
        {
            fout<<0;
            return;
        }
        for(int i=digits[0];i>=1;i--)
            fout<<digits[i];
    }
};

Huge dp[2][NMAX];

int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(NULL);
    fout.tie(NULL);

    int n,i,j,maxi=-1;
    bool ok=false;
    fin>>n;
    for(i=1;i<=n;i++)
    {
        fin>>v[i];
        maxi=max(maxi,v[i]);
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=maxi;j++)
        {
            dp[!ok][j].reset();
            dp[!ok][j].add_huge(dp[ok][j]);
        }
        dp[!ok][v[i]].add_num(1);
        for(j=1;j<=maxi;j++)
            if(dp[ok][j].digits[0]!=0)
                dp[!ok][__gcd(j,v[i])].add_huge(dp[ok][j]);
        ok=!ok;
    }
    dp[ok][1].print();
    fin.close();
    fout.close();
    return 0;
}