Pagini recente » Cod sursa (job #1175221) | Cod sursa (job #204216) | Cod sursa (job #1323468) | Cod sursa (job #2228327) | Cod sursa (job #1472646)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxN 500
#define maxL 1000
using namespace std;
int n, x, i, j, k, v[maxN], w[maxN];
int dp[maxN + 2][maxN * 2 + 2][maxL];
void add(int A[], int B[])
{
int i, t = 0;
for (i = 1; i <= A[0] || i <= B[0] || t; i++, t /= 10)
A[i] = (t += A[i] + B[i]) % 10;
A[0] = i - 1;
}
int gcd(int d, int i)
{
int r;
if (d < i)
swap(d, i);
r = d % i;
while (r)
d = i,
i = r,
r = d % i;
return i;
}
void read()
{
freopen("indep.in", "r", stdin);
freopen("indep.out", "w", stdout);
scanf("%d", &n);
w[++ w[0]] = 1;
for (i = 1; i <= n; ++ i)
{
scanf("%d", &v[i]);
add(dp[i][v[i]], w);
for (j = 1; j <= maxN * 2; ++ j)
{
k = gcd(j, v[i]);
add(dp[i][k], dp[i - 1][j]);
add(dp[i][k], dp[i - 1][k]);
}
}
}
void write()
{
freopen("indep.out", "w", stdout);
for (i = dp[n][1][0]; i >= 1; -- i)
printf("%d", dp[n][1][i]);
}
int main()
{
read();
write();
return 0;
}