Cod sursa(job #1405252)

Utilizator Ionut228Ionut Calofir Ionut228 Data 28 martie 2015 23:17:33
Problema Indep Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <fstream>

using namespace std;

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

int N;

struct nrMare
{
    int nr[202];
};
nrMare dp[505][1005], unu; // cate subsiruri din primele i elemente au cmmdc = j

int Euclid(int a, int b)
{
    if (!b)
        return a;
    return Euclid(b, a % b);
}

void add(nrMare& A, nrMare B)
{
    int r = 0;
    for (int i = 1; i <= A.nr[0] ||  i <= B.nr[0]; ++i)
    {
        A.nr[i] = r + A.nr[i] + B.nr[i];
        r = A.nr[i] / 10;
        A.nr[i] %= 10;
    }
    A.nr[0] = max(A.nr[0], B.nr[0]);
    if (r)
        A.nr[++A.nr[0]] = r;
}

int main()
{
    fin >> N;
    unu.nr[0] = 1;
    unu.nr[1] = 1;
    for (int i = 1, x; i <= N; ++i)
    {
        fin >> x;

        add(dp[i][x], unu);
        for (int j = 1; j <= 40; ++j)
        {
            add(dp[i][Euclid(x, j)], dp[i - 1][j]);
            add(dp[i][j], dp[i - 1][j]); // aici intra si dp[i][Euclid(x, j)] += dp[i - 1][Euclid(x, j)]
        }
    }
    for (int i = dp[N][1].nr[0]; i >= 1; --i)
        fout << dp[N][1].nr[i];
    fout << '\n';

    fin.close();
    fout.close();
    return 0;
}