Cod sursa(job #588196)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 7 mai 2011 11:09:42
Problema Indep Scor 100
Compilator cpp Status done
Runda juniori_2011_1 Marime 0.99 kb
#include<stdio.h>
#include<fstream>
using namespace std;

long n,x[501];
short a[501][1001][250],u[300];

void add(short int a[],short int b[])
{
	int i,t=0;
	for (i=1;i<=a[0] || i<=b[0] || t;i++,t/=10)
		a[i]=(t+=a[i]+b[i])%10;
	a[0]=i-1;
}

int cmmdc(int a,int b) {
	int r;
	while (b!=0) {
		r=a%b;
		a=b;
		b=r;
	}
	return a;
}

int main() {
	int i,j;
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;++i) {
		scanf("%d",&x[i]);
	}
	u[0]=u[1]=1;
	a[1][x[1]][0]=a[1][x[1]][1]=1;
	for(i=2;i<=n;++i) {
		memset(a[i&1],0,sizeof(a[i&1]));
		for(j=1;j<1001;j++)
			add(a[i&1][cmmdc(j,x[i])],a[(i-1)&1][j]);
		add(a[i&1][x[i]],u);
		for(j=1;j<1001;j++)
			add(a[i&1][j],a[(i-1)&1][j]);
			/*d=cmmdc(x[i],j);
			a[i][d]+=a[i-1][j];
			a[i][j]+=a[i-1][j];*/
	}
	//printf("%lld",a[n][1]);
	if(a[n&1][1][0]==0) {
		printf("0");
		return 0;
	}
	for(i=a[n&1][1][0];i>0;--i)
		printf("%d",a[n&1][1][i]);
	return 0;
}