Pagini recente » Cod sursa (job #456533) | Cod sursa (job #2268341) | Cod sursa (job #1785588) | Cod sursa (job #1941386) | Cod sursa (job #1405233)
#include <fstream>
using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");
int N, pos;
struct nrMare
{
int nr[202];
};
nrMare dp[2][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)
{
if (A.nr[0] == 0)
{
for (int i = 1; i <= B.nr[0]; ++i)
A.nr[i] = B.nr[i];
A.nr[0] = B.nr[0];
}
else
{
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 initLinie(int pos)
{
for (int i = 1; i <= 1000; ++i)
dp[pos][i].nr[0] = 0;
}
int main()
{
fin >> N;
pos = 0;
unu.nr[0] = 1;
unu.nr[1] = 1;
for (int i = 1, x; i <= N; ++i, pos = 1 - pos)
{
initLinie(pos);
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;
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;
}