Cod sursa(job #3340148)

Utilizator rapidu36Victor Manz rapidu36 Data 12 februarie 2026 11:01:37
Problema Indep Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>

using namespace std;

const int VMIN = 1;
const int VMAX = 1000;
const int N = 500;
const int NC = 200;

int nrs[2][VMAX+1][NC], unu[NC];

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

void copie(int dest[], int src[])
{
    for (int i = 0; i < NC; i++)
    {
        dest[i] = src[i];
    }
}

void suma(int a[], int b[])
{
    int i = 1, nc = max(a[0], b[0]), t = 0;
    while (i <= nc)
    {
        int s = a[i] + b[i] + t;
        a[i] = s % 10;
        t = s / 10;
        i++;
    }
    if (t > 0)
    {
        a[i++] = t;
    }
    a[0] = i - 1;
}

int main()
{
    ifstream in("indep.in");
    ofstream out("indep.out");
    int n;
    in >> n;
    unu[0] = unu[1] = 1;
    for (int i = 1; i <= n; i++)
    {
        int x_i;
        in >> x_i;
        int lin_c = i % 2;
        int lin_a = 1 - lin_c;
        for (int val = VMIN; val <= VMAX; val++)
        {
            //nrs[lin_c][val] = nrs[lin_a][val];
            copie(nrs[lin_c][val], nrs[lin_a][val]);
        }
        for (int val = VMIN; val <= VMAX; val++)
        {
            int d = cmmdc(x_i, val);
            //nrs[lin_c][d] += nrs[lin_a][val];
            suma(nrs[lin_c][d], nrs[lin_a][val]);
        }
        //nrs[lin_c][x_i]++;
        suma(nrs[lin_c][x_i], unu);
    }
    //out << nrs[n%2][1] << "\n";
    int n_2 = n % 2;
    for (int i = nrs[n_2][1][0]; i >= 1; i--)
    {
        out << nrs[n_2][1][i];
    }
    out << "\n";
    in.close();
    out.close();
    return 0;
}