Cod sursa(job #1405259)

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

using namespace std;

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

int N;

struct nrMare
{
    short int nr[505];
};
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;
}
*/
void add(nrMare& A, nrMare B)
{
      int i, t = 0;
      for (i=1; i<=A.nr[0] || i<=B.nr[0] || t; i++, t/=10)
              A.nr[i] = (t += A.nr[i] + B.nr[i]) % 10;
      A.nr[0] = i - 1;
}

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 <= 1000; ++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;
}