Cod sursa(job #2925355)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 14 octombrie 2022 23:11:38
Problema Indep Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int maxN = 505, maxVal = 1000;
int n, dp[2][maxVal + 5][160], v[maxN], unu[160];

void adunare(int s[], int t[])
{
    int i, r = 0;
    for(i = 1; i <= s[0] || i <= t[0] || r; i++, r /= 10)
    {
        r += s[i] + t[i];
        s[i] = r % 10;
    }
    s[0] = i - 1;
}

int euclid(int a, int b)
{
    if(b == 0)
        return a;
    return euclid(b, a % b);
}

int main()
{
    fin >> n;
    for(int i = 1; i <= n; i++)
        fin >> v[i];
    unu[0] = 1;
    unu[1] = 1;
    for(int i = 1; i <= n; i++)
    {
        int ci = i % 2, ni = (i + 1) % 2;
        for(int j = 1; j <= maxVal; j++)
        {
            for(int k = 0; k <= dp[ci][j][0]; k++)
               dp[ni][j][k] = dp[ci][j][k];
        }
        adunare(dp[ni][v[i]], unu);
        for(int j = 1; j <= maxVal; j++)
        {
            int cmmdc = euclid(j, v[i]);
            adunare(dp[ni][cmmdc], dp[ci][j]);
        }
    }
    int ind = (n + 1) % 2;
    if(dp[ind][1][0] == 0)
        fout << 0;
    else
        for(int i = dp[ind][1][0]; i; i--)
            fout << dp[ind][1][i];
    return 0;
}