Cod sursa(job #907472)

Utilizator veleanduAlex Velea veleandu Data 7 martie 2013 23:09:28
Problema Indep Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define Sigma 100000000
#define max_nr 1000
#define nr_cif 100

int i,j,n,x;

struct NrMare{
	int Cif[nr_cif],NrCif;
	NrMare(){
		NrCif=0;
		for( int i=0; i<nr_cif; ++i )
			Cif[i]=0;
	}
	NrMare( int _nr ){
		NrCif=1;
		for( int i=0; i<nr_cif; ++i )
			Cif[i]=0;
		Cif[0]=_nr;
	}
	void add( NrMare right ){
 		int i,t=0;
		for( i=0; i<max( NrCif, right.NrCif ); ++i ){
 			Cif[i]+=right.Cif[i]+t;
			t=Cif[i]/Sigma;
			while( Cif[i] >= Sigma )
				Cif[i]-=Sigma;
		}
		NrCif=max( NrCif, right.NrCif );
		if( t ){
			Cif[ NrCif ]=t;
			NrCif++;
		}
	}
	void afisare(){
		for( int i=NrCif-1; i>=0; --i )
			printf("%d",Cif[i]);
		printf("\n");
	}
} Dp[max_nr],NrMareUnu(1);

int gcd( int a, int b ){
	if( !b ) return a;
	return gcd( b, a%b );
}

int main(){
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);
	scanf("%d", &n );
	for( i=1; i<=n; ++i ){
		scanf("%d", &x );
		for( j=1; j<max_nr; ++j ){
 			Dp[gcd(x,j)].add(Dp[j]);
		}
		Dp[x].add(NrMareUnu);
	}
	NrMare Rez(0);
	Dp[1].afisare();
	return 0;
}