Pagini recente » Cod sursa (job #2308203) | Cod sursa (job #2636853) | Cod sursa (job #585539) | Cod sursa (job #376525) | Cod sursa (job #2923518)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");
const int maxN = 505, maxVal = 1000;
int n, dp[2][maxVal + 5][160], v[maxN], unu[160];
void adunare(int s[], int t[])
{
int i, r = 0;
for(i = 1; i <= s[0] || i <= t[0] || r; i++, r /= 10)
{
r += s[i] + t[i];
s[i] = r % 10;
}
s[0] = i - 1;
}
int euclid(int a, int b)
{
if(b == 0)
return a;
return euclid(b, a % b);
}
int main()
{
fin >> n;
for(int i = 1; i <= n; i++)
fin >> v[i];
unu[0] = 1;
unu[1] = 1;
for(int i = 1; i <= n; i++)
{
int ci = i % 2, ni = (i + 1) % 2;
for(int j = 1; j <= maxVal; j++)
{
for(int k = 0; k <= dp[ci][j][0]; k++)
dp[ni][j][k] = dp[ci][j][k];
}
adunare(dp[ni][v[i]], unu);
for(int j = 1; j <= maxVal; j++)
{
int cmmdc = euclid(j, v[i]);
adunare(dp[ni][cmmdc], dp[ci][j]);
}
}
int ind = (n + 1) % 2;
for(int i = dp[ind][1][0]; i; i--)
fout << dp[ind][1][i];
return 0;
}