Cod sursa(job #6583)

Utilizator mariusdrgdragus marius mariusdrg Data 20 ianuarie 2007 12:06:40
Problema Indep Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include<stdio.h>


typedef short lnum[200];

const int maxn  = 1010;
const int maxn2 = 500;


short j;
lnum mat[maxn2][maxn];
short a[maxn];
short i;
lnum s;
short n;

short max(short a,short b)
{
        if (a<b) return b;
        return a;
}

void ad(lnum &a,lnum &b,lnum &c)
{
        int i;
        a[0]=max(b[0],c[0]);
        for(i=1;i<=max(b[0],c[0]);i++)
        {
                a[i]=c[i]+b[i];
        }
        for(i=1;i<=a[0];i++)
        {
                if (a[i]>=10)
                {
                        a[i]%=10;
                        a[i+1]++;
                        if (a[a[0]+1]>0) a[0]++;
                }
        }
}

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


short cmmdc(short a, short b)
{

        while (a)
        {
                short aux=a;
                a=b%a;
                b=aux;
        }
        return b;
}


int main()
{
        freopen("indep.in","r",stdin);
        freopen("indep.out","w",stdout);
        scanf("%hd",&n);
        for(i=1;i<=n;i++)
        {
                short x;
                scanf("%hd",&a[i]);
                s[1]=1;
                s[0]=1;
                ad(mat[i][a[i]],mat[i][a[i]],s);
        }
        short x;
        for(i=2;i<=n;i++)
        {
                for(j=1;j<=1000;j++)
                        ad(mat[i][j],mat[i][j],mat[i-1][j]);
                for(j=1000;j>0;j--)
                        if (mat[i-1][j][0]!=0)
                        {
                                x=cmmdc(j,a[i]);
                                ad(mat[i][x],mat[i][x],mat[i-1][j]);
                        }

        }
        for(i=mat[n][1][0];i>0;i--)
                printf("%hd",mat[n][1][i]);
        printf("\n");

        return 0;
        
}