Cod sursa(job #61747)

Utilizator sealTudose Vlad seal Data 20 mai 2007 15:48:09
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>
#define Nm 500
#define Km 1001
#define Cm 200
#define BASE 1000000000
int M[Km][Cm],A[Nm],One[Cm]={1,1},n;

void read()
{
    int i;

    freopen("indep.in","r",stdin);
    scanf("%d",&n);
    for(i=0;i<n;++i)
	scanf("%d",A+i);
}

void add(int A[], int B[])
{
    int i,t=0;

    for(i=1;i<=A[0] || i<=B[0] || t;++i,t/=BASE)
	A[i]=(t+=A[i]+B[i])%BASE;
    A[0]=i-1;
}

int cmmdc(int a, int b)
{
    int r;

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

void solve()
{
    int i,j,k;

    k=A[0];
    M[k][0]=M[k][1]=1;
    for(i=1;i<n;++i)
    {
	for(j=1;j<=k;++j)
	    add(M[cmmdc(j,A[i])],M[j]);
	add(M[A[i]],One);
	if(A[i]>k)
	    k=A[i];
    }
}

int digits(int x)
{
    int i=0;

    if(!x)
	return 1;

    while(x)
    {
	++i;
	x/=10;
    }
    return i;
}

void write()
{
    int i,j,k;

    freopen("indep.out","w",stdout);
    if(M[1][0])
    {
	printf("%d",M[1][M[1][0]]);
	for(i=M[1][0]-1;i;--i)
	{
	    k=digits(M[1][i]);
	    for(j=0;j<9-k;++j)
		printf("0");
	    printf("%d",M[1][i]);
	}
	printf("\n");
    }
    else
	printf("0\n");
}

int main()
{
    read();
    solve();
    write();
    return 0;
}