Pagini recente » Cod sursa (job #1209189) | Cod sursa (job #289417) | Cod sursa (job #1180571) | Cod sursa (job #2849031) | Cod sursa (job #1405259)
#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;
}