Pagini recente » Cod sursa (job #1085091) | Cod sursa (job #1573805) | Cod sursa (job #2368686) | Cod sursa (job #3213120) | Cod sursa (job #1149397)
#include<cstdio>
#include<cstring>
using namespace std;
#define NMAX 501
#define BASE 1000000000
int N , v[NMAX] , VMAX;
struct huge{
int nr[200];
}D[1001] , unu;
inline void add(huge &A , huge B)
{
int t = 0 , p = 1;
for( p = 1 ; p <= A.nr[0] || p <= B.nr[0] || t ; ++p , t/=BASE)
{
t += A.nr[p] + B.nr[p];
A.nr[p] = t%BASE;
}
A.nr[0] = p-1;
}
inline 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];
}
void seteaza(huge &A , int val)
{
A.nr[1] = val;
A.nr[0] = 1;
}
inline 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[A.nr[0]]);
for(int i = A.nr[0]-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]);
if(v[i] > VMAX)VMAX = v[i];
}
seteaza (D[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 )
add( D[gcd(k,v[i])] , D[k]);
add(D[v[i]],unu);
}
tipar(D[1]);
return 0;
}