Cod sursa(job #2610837)

Utilizator Rares31100Popa Rares Rares31100 Data 5 mai 2020 19:14:15
Problema Indep Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;

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

int n,a[501];
string dp[501][1001];

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

    return a;
}
string add(string a,string b)
{
    string c;
    c.resize( max(a.size(),b.size())+4 );

    for(int i=0;i<c.size()-1;i++)
    {
        c[i] += (i<a.size()?a[i]-'0':0) + (i<b.size()?b[i]-'0':0);
        c[i+1] = c[i]/10;
        c[i] = c[i]%10 + '0';
    }
    c.erase(c.end()-1);
    while(c.size()>1 && c[c.size()-1]=='0')
        c.erase(c.end()-1);

    return c;
}

int main()
{
    in>>n;

    for(int i=1;i<=n;i++)
        in>>a[i];

    for(int i=1;i<=n;i++)
        for(int j=1;j<=1000;j++)
            dp[i][j]="0";

    dp[1][ a[1] ]="1";

    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<=1000;j++)
        {
            dp[i][ cmmdc(j,a[i]) ]=add(dp[i][ cmmdc(j,a[i]) ],dp[i-1][j]);
            dp[i][j]=add(dp[i][j],dp[i-1][j]);
        }

        dp[i][ a[i] ]=add(dp[i][ a[i] ],"1");
    }

    for(int i=dp[n][1].size()-1;i>=0;i--)
        out<<dp[n][1][i];

    return 0;
}