Cod sursa(job #3173997)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 24 noiembrie 2023 09:22:15
Problema Indep Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <bits/stdc++.h>

using namespace std;

const int max_size = 1e3 + 1;

int dp[2][max_size][5 * max_size], unu[5 * max_size];

void sum (int x[], int y[], int s[])
{
    int t = 0, i;
    for (i = 1; i <= x[0] || i <= y[0] || t > 0; i++)
    {
        int aux = x[i] + y[i] + t;
        s[i] = aux % 10;
        t = aux / 10;
    }
    s[0] = i - 1;
    if (t > 0)
    {
        s[++s[0]] = t;
    }
}

void copie (int x[], int y[])
{
    for (int i = 0; i <= x[0]; i++)
    {
        y[i] = x[i];
    }
}

int main ()
{
    #ifdef LOCAL
       freopen("test.in", "r", stdin);
       freopen("test.out", "w", stdout);
    #else
       freopen("indep.in", "r", stdin);
       freopen("indep.out", "w", stdout);
    #endif // LOCAL
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    unu[0] = 1;
    unu[1] = 1;
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        int st = i % 2, x;
        cin >> x;
        for (int j = 1; j < max_size; j++)
        {
            copie(dp[1 - st][j], dp[st][j]);
        }
        for (int j = 1; j < max_size; j++)
        {
            int gcd = __gcd(x, j);
            sum(dp[1 - st][j], dp[st][gcd], dp[st][gcd]);
        }
        sum(dp[st][x], unu, dp[st][x]);
    }
    int st = n % 2;
    if (dp[st][1][0] == 0)
    {
        cout << 0;
    }
    for (int i = dp[st][1][0]; i > 0; i--)
    {
        cout << dp[st][1][i];
    }
    return 0;
}