Pagini recente » Cod sursa (job #2273837) | Cod sursa (job #483462) | Cod sursa (job #625688) | Cod sursa (job #1968416) | Cod sursa (job #1405293)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");
int N, pos;
struct nrMare
{
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);
}
nrMare add(nrMare A, nrMare B)
{
nrMare aux;
for (int i = 0; i <= 200; ++i)
aux.nr[i] = 0;
int r = 0;
for (int i = 1; i <= A.nr[0] || i <= B.nr[0]; ++i)
{
if (i > A.nr[0])
aux.nr[i] = r + B.nr[i];
else if (i > B.nr[0])
aux.nr[i] = r + A.nr[i];
else
aux.nr[i] = r + A.nr[i] + B.nr[i];
r = aux.nr[i] / 10;
aux.nr[i] %= 10;
}
aux.nr[0] = max(A.nr[0], B.nr[0]);
if (r)
aux.nr[++aux.nr[0]] = r;
return aux;
}
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)
dp[pos][j].nr[0] = 0;
fin >> x;
dp[pos][x] = add(dp[pos][x], unu);
for (int j = 1; j <= 1000; ++j)
{
dp[pos][Euclid(x, j)] = add(dp[pos][Euclid(x, j)], dp[1 - pos][j]);
dp[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;
}