Pagini recente » Cod sursa (job #676756) | Cod sursa (job #2191762) | Poli Iasi | Cod sursa (job #2872921) | Cod sursa (job #2310599)
#include <bits/stdc++.h>
#define maxV 1001
#define maxL 101
#define base 1000000000
#define ll long long
FILE *fin = freopen("indep.in", "r", stdin);
FILE *fout = freopen("indep.out", "w", stdout);
int dp[2][maxV][maxL];
int gcd(int x, int y)
{
int r = x % y;
while (r)
{
x = y;
y = r;
r = x % y;
}
return y;
}
void add(int A[], int B[])
{
int i, t = 0;
for (i = 1; i <= A[0] || i <= B[0] || t; i++, t /= base)
A[i] = (t += A[i] + B[i]) % base;
A[0] = i - 1;
}
int main()
{
int n, *v;
scanf("%d", &n);
v = new int[n + 1];
for (int i = 0; i < n; ++ i)
scanf("%d", &v[i]);
int one[maxL];
memset(one, 0, sizeof(one));
one[++ one[0]] = 1;
add(dp[0][v[0]], one);
for (int i = 1, t = 1; i < n; ++ i, t = !t)
{
memset(dp[t], 0, sizeof(dp[t]));
for (int d1 = 1; d1 < maxV; ++ d1)
{
int d2 = gcd(d1, v[i]);
add(dp[t][d2], dp[!t][d1]); /// d2 <= d1
add(dp[t][d1], dp[!t][d1]);
}
add(dp[t][v[i]], one);
}
int sz = dp[!(n & 1)][1][0];
printf("%d", dp[!(n & 1)][1][sz]);
for (int i = sz - 1; i >= 1; -- i)
{
int x = dp[!(n & 1)][1][i];
if (x < 10) printf("00000000%d", x);
else if (x < 100) printf("0000000%d", x);
else if (x < 1000) printf("000000%d", x);
else if (x < 10000)
printf("00000%d", x);
else if (x < 100000)
printf("0000%d", x);
else if (x < 1000000)
printf("000%d", x);
else if (x < 10000000)
printf("00%d", x);
else if (x < 100000000)
printf("0%d", x);
else
printf("%d", x);
}
return 0;
}