Pagini recente » Cod sursa (job #2244725) | Cod sursa (job #1040201) | Cod sursa (job #616963) | Cod sursa (job #237052) | Cod sursa (job #1718388)
#include <bits/stdc++.h>
#define Nmax 502
#define Kmax 1002
#define Lmax 100
#define base 1000000000
#define ct 9
FILE *fin = freopen("indep.in", "r", stdin);
FILE *fout = freopen("indep.out", "w", stdout);
using namespace std;
int n;
int dp[2][Kmax][Lmax];
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 euclid(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()
{
int val, gdp;
scanf("%d", &n);
for(int i = 1; i <= n; ++ i)
{
scanf("%d", &val);
dp[i & 1][val][0] = dp[i & 1][val][1] = 1;
for(int j = 1; j <= Kmax; ++ j)
{
gdp = euclid(val, j);
add(dp[i & 1][gdp], dp[(i - 1) & 1][j]);
add(dp[i & 1][j], dp[(i - 1) & 1][j]);
}
memset(dp[(i - 1) & 1], 0, sizeof(dp[(i - 1) & 1]));
}
}
void write()
{
int x, Pow;
n &= 1;
printf("%d", dp[n][1][dp[n][1][0]]);
for(int i = dp[n][1][0] - 1; i >= 1; -- i)
{
x = 1;
Pow = 0;
while(dp[n][1][i] > x)
{
x *= 10;
++ Pow;
}
for(int j = Pow + 1; j <= ct; ++ j)
printf("0");
printf("%d", dp[n][1][i]);
}
}
int main()
{
read();
write();
return 0;
}