Pagini recente » Cod sursa (job #1791162) | Cod sursa (job #1350748) | Cod sursa (job #2377026) | Cod sursa (job #1867806) | Cod sursa (job #1149377)
#include<cstdio>
#include<cstring>
using namespace std;
#define NMAX 501
#define VMAX 1001
#define BASE 1000000000
int N , v[NMAX] , g[VMAX][VMAX];
struct huge{
int nr[300];
huge()
{
memset(nr,0,sizeof(nr));
}
}D[2][VMAX] , unu;
void add(huge &A , huge B)
{
int t = 0 , i ;
for( i = 1 ; i <= A.nr[0] || i <= B.nr[0] || t ; ++i , t/=BASE)
A.nr[i] = (t+= A.nr[i]+ B.nr[i]) %BASE;
A.nr[0] = i-1;
}
void cpy(huge &A , huge B)
{
for(int i = 1 ; i <= B.nr[0] ; ++i )
A.nr[i] = B.nr[i];
A.nr[0] = B.nr[0];
}
int sz(huge A)
{
return A.nr[0];
}
void seteaza(huge &A , int val)
{
A.nr[1] = val;
A.nr[0] = 1;
}
int gcd(int a , int b)
{
while(b)
{
int r = a%b;
a = b;
b = r;
};
return a;
}
void tipar(huge A)
{
printf("%d" , A.nr[sz(A)]);
for(int i = sz(A)-1 ; i ; i-- )
printf("%09d" , A.nr[i]);
}
int main()
{
freopen("indep.in" , "r" , stdin );
freopen("indep.out" , "w" , stdout );
scanf("%d" , &N );
for(int i = 1 ; i <= N ; ++i )
scanf("%d" , &v[i]);
for(int i = 1 ; i < VMAX ; ++i )
for(int j = 1 ; j < VMAX ; ++j )
g[i][j] = g[j][i] = gcd(i,j);
seteaza (D[0][v[1]] , 1);
unu.nr[1] = unu.nr[0] = 1;
for(int i = 2 , j = 1; i <= N ; ++i , j = 1-j )
{
for(int k = 1 ; k < VMAX ; ++k )
cpy(D[j][k],D[1-j][k]);
for(int k = 1 ; k < VMAX ; ++k )
add( D[j][g[k][v[i]]] , D[1-j][k]);
add(D[j][v[i]],unu);
}
if(N%2)tipar(D[0][1]);
else tipar(D[1][1]);
return 0;
}