Pagini recente » Cod sursa (job #2520708) | Cod sursa (job #1901374) | Cod sursa (job #772424) | Cod sursa (job #2128430) | Cod sursa (job #670416)
Cod sursa(job #670416)
#include <cstdio>
#include <algorithm>
#include <cstring>
#define NMAX 500
#define LMAX 1000
#define BASE 1000000000
#define CMAX 50
using namespace std;
int v[NMAX];
int a[2][LMAX+1][CMAX], b[CMAX];
int N;
void print(int a[])
{
printf("%d", a[1]);
for(int i=2;i<=a[0];++i)
{
printf("%09d", a[i]);
}
printf("\n");
}
int cmmdc(int a, int b)
{
if(a == 0) return b;
if(b == 0) return a;
if(a > b)
{
return cmmdc(a%b, b);
}
return cmmdc(a, b%a);
}
void add(int a[], int b[]) //adun pe b peste a
{
int m = max(a[0], b[0]);
int c = 0;
a[0] = m;
for(int i=1;i<=m;++i)
{
int aux = a[i] + b[i] + c;
if(a[i] > BASE || b[i] > BASE)
{
aux++;
}
if(aux<0)
{
aux++;
}
a[i] = aux % BASE;
c = aux / BASE;
}
if(c)
{
a[++a[0]] = c;
}
}
int main()
{
freopen("indep.in", "r", stdin);
freopen("indep.out", "w", stdout);
scanf("%d", &N);
for(int i=0;i<N;++i)
{
scanf("%d", &v[i]);
}
a[1][v[0]][0] = 1;
a[1][v[0]][1] = 1;
int l = 1;
b[0] = 1;
b[1] = 1;
for(int i=1;i<N;++i, l=1-l)
{
for(int j=1;j<=LMAX;++j)
{
memset(a[1-l][j], 0, sizeof(a[1-l][j]));
a[1-l][j][0] = 1;
}
for(int j=1;j<=LMAX;++j)
{
if(a[l][j][0] > 0)
{
add(a[1-l][cmmdc(j,v[i])], a[l][j]);
add(a[1-l][j], a[l][j]);
}
}
add(a[1-l][v[i]], b);
}
print(a[l][1]);
return 0;
}