Pagini recente » Cod sursa (job #1832144) | Cod sursa (job #1343310) | Cod sursa (job #1594369) | Cod sursa (job #1589694) | Cod sursa (job #1000306)
#include <iostream>
#include <fstream>
#include <cstring>
#define NMax 510
#define ValMax 1010
using namespace std;
int n, a[NMax], maxim;
int dp[2][ValMax];
inline void Read()
{
ifstream f ("indep.in");
f>>n;
int i;
for (i=1; i<=n; ++i)
f>>a[i], maxim = max(maxim, a[i]);
f.close();
}
inline int cmmdc(int x, int y)
{
int r;
while (y)
{
r = x%y;
x = y;
y = r;
}
return x;
}
inline void Solve()
{
/// dp[i][j] = numarul de subsiruri existente folosind elemente din primele i cu cmmdc = j
/// dp[i][j] -> dp[i+1][j]
int i, p, q, j;
for (i=1, p=1, q=0; i<=n; ++i, swap(p, q))
{
dp[p][a[i]] = 1;
for (j=1; j<=maxim; ++j)
{
dp[p][j] += dp[q][j];
dp[p][cmmdc(j, a[i])] += dp[q][j];
}
memset(dp[q], 0, sizeof(dp[q]));
}
ofstream g ("indep.out");
g<<dp[q][1]<<"\n";
g.close();
}
int main()
{
Read();
Solve();
return 0;
}