Cod sursa(job #1405302)

Utilizator Ionut228Ionut Calofir Ionut228 Data 29 martie 2015 00:09:57
Problema Indep Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

int N, pos;

struct nrMare
{
    short int nr[202];
};
nrMare dp[3][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;
    int i = 1;
    for (i = 1; i <= A.nr[0] ||  i <= B.nr[0] || r; ++i)
    {
        A.nr[i] = r + A.nr[i] + B.nr[i];
        r = A.nr[i] / 100000000;
        A.nr[i] %= 100000000;
    }
    A.nr[0] = i - 1;
}

int main()
{
    fin >> N;
    unu.nr[0] = 1;
    unu.nr[1] = 1;
    pos = 0;
    for (int i = 1, x; i <= N; ++i, pos = 1 - pos)
    {
        for (int j = 1; j <= 1000; ++j)
        {
            for (int k = 1; k <= dp[pos][j].nr[0]; ++k)
                dp[pos][j].nr[k] = 0;
            dp[pos][j].nr[0] = 0;
        }

        fin >> x;

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

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