Cod sursa(job #489989)

Utilizator teapatester teapa Data 4 octombrie 2010 14:39:05
Problema Indep Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<cstdio>
const int base = 1000000000 ;
int S[2][1005][30],V[505],N,max ;
inline int maxim ( int A, int B ) 
{
   return A>B?A:B;
}
inline int cmmdc ( int A, int B ) 
{
    while ( B ) 
	{
        int R = A % B ;
        A = B ;
        B = R ;
    }
    return A ;
}
void add ( int A[], int B[] ) 
{
    int i, t = 0;
    for (i = 1; i <= A[0] || i <= B[0] || t; i++, t /= base) 
    {
		if (i>A[0]) A[i]=0;
		if (i>B[0]) B[i]=0;
		A[i] = ( t +=A[i]+B[i] ) % base;
	}
    A[0] = i - 1;
}
void afis ( int A[] )
{
    printf ( "%d" , A[A[0]] ) ;
    for ( int i = A[0] - 1; i ; --i )  printf ( "%09d", A[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 ) ;
        max = maxim ( max, V[i] ) ;
    }
    for ( int i = 1, k = 0; i <= N; ++i, k = !k )
	{
        S[!k][ V[i] ][0] = S[!k][ V[i] ][1] =1;
        for ( int j = 1, l ; j <= max; ++j ) 
		{
            if ( S[k][j][0] ) 
			{
                l = cmmdc ( j, V[i] ) ;
                add ( S[!k][l], S[k][j] ) , add ( S[!k][j], S[k][j] ) ;
            }
        }
        for ( int j = 1; j <= max; ++j ) S[k][j][0] = 0;
    }
	afis( S[N & 1][1] ) ;
    return 0;
}