Cod sursa(job #162141)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 19 martie 2008 15:52:00
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <iostream>
#include <string>
#define FIN "indep.in"
#define FOUT "indep.out"
#define MAX_N 500
#define MAX_VAL 1000
#define MAX_CIF 2000
using namespace std;
int dyn[2][MAX_VAL+3][MAX_CIF+1];
int n;
int v[MAX_N+1];


void iofile(void){
	freopen(FIN,"rt",stdin);
	freopen(FOUT,"wt",stdout);
	scanf("%d",&n);
	for (int i=1,x;i<=n;i++){
		scanf("%d",&v[i]);
	}
	fclose(stdin);
	return ;
}


int gcd(int a,int b){
	int r;
	while (b){
		r=(a%b);
		a=b;
		b=r;
	}
	return a;
}

void adun(int *a,int *b){
        int x,i=1,t=0;
        while (i<=a[0] && i<=b[0]){
                x=a[i]+b[i]+t;
                a[i]=x%10;
                t=x/10;
                i++;
        }
        if (i<=a[0]){
                while (i<=a[0]) {
                        x=a[i]+t;
                        a[i]=x%10;
                        t=x/10;
                        i++;
                }
         } else while (i<=b[0]){
                x=b[i]+t;
                a[i]=x%10;
                t=x/10;
                i++;
         }
        a[0]=i-1;
        if (t){
                a[++a[0]]=t;
        }
        return ;
}


void dinamica(void){
        int ind=0;
        int v1[MAX_CIF+1];
        if (n==1){
                if (v[1]==1){printf("%d\n",1);} else{printf("%d\n",0);}
                fclose(stdout);
                return ;
        }
        v1[0]=1;
        v1[1]=1;
	for (int i=1;i<n;i++){
                adun(dyn[ind][v[i]],v1);
                for (int j=1;j<=MAX_VAL;j++){
                        dyn[1-ind][j][0]=1;
                        dyn[1-ind][j][1]=0;
                }
                for (int j=1;j<=MAX_VAL;j++){if (dyn[ind][j][0]>1 || dyn[ind][j][1]>0){
                        adun(dyn[1-ind][j],dyn[ind][j]);
                        adun(dyn[1-ind][gcd(j,v[i+1])],dyn[ind][j]);
		}
	}
        ind=1-ind;
        }
        adun(dyn[ind][v[n]],v1);
        for (int i=dyn[ind][1][0];i>=1;i--){
                printf("%d",dyn[ind][1][i]);
        }
        printf("\n");
	fclose(stdout);
	return ;
}

int main(void){
	iofile();
	dinamica();
	return 0;
}