Pagini recente » Cod sursa (job #284289) | Cod sursa (job #2232453) | Cod sursa (job #1906031) | Cod sursa (job #618537) | Cod sursa (job #1405302)
#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;
}