Pagini recente » Cod sursa (job #2245389) | Cod sursa (job #468165) | Cod sursa (job #2410791) | Cod sursa (job #1662888) | Cod sursa (job #47291)
Cod sursa(job #47291)
#include <cstdio>
#include <cassert>
#include <string>
#define FIN "indep.in"
#define FOUT "indep.out"
#define NMAX 501
int s1[2*NMAX][50], s2[2*NMAX][50], N, v[NMAX], max, unu[50];
void read ()
{
scanf ("%d", &N);
for (int i = 1; i <= N; ++ i)
{
scanf ("%d", &v[i]);
if (v[i] > max)
max = v[i];
}
}
int cmmdc (int a, int b)
{
int r;
do
{
r = a % b;
a = b;
b = r;
}
while (r != 0);
return a;
}
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;
}
void solve ()
{
int c;
unu[0] = unu[1] = 1;
for (int i = 1; i <= N; ++ i)
{
for (int j = 1; j <= max; ++ j)
{
c = cmmdc (j, v[i]);
if (c != j)
{
add (s2[c], s1[j]);
add (s2[c], s1[c]);
}
else
add (s2[c], s1[j]);
}
add (s2[v[i]], unu);
memcpy (s1, s2, sizeof (s2));
memset (s2, 0, sizeof (s2));
}
for (int i = s1[1][0]; i >= 1; -- i)
printf ("%d", s1[1][i]);
printf ("\n");
}
int
main ()
{
freopen (FIN, "rt", stdin);
freopen (FOUT, "wt", stdout);
read ();
solve ();
return 0;
}