Cod sursa(job #37153)

Utilizator crawlerPuni Andrei Paul crawler Data 24 martie 2007 17:28:13
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <stdio.h>
#include <string.h>

int cmmdc(int x,int y)
 {
  if(!y)
   return x;
    else
   return cmmdc(y,x%y);
 }


void inc(int A[], 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 a[2][1024][1024], v[512];
int aux[1024];

int main()
 {
   freopen("indep.in","r",stdin);
   freopen("indep.out","w",stdout);

   int n,i,j, tmp, MAX=0, i1=0,i2=1;

   aux[0] = 1;
   aux[1] = 1;

   scanf("%d", &n);

   for(i=1;i<=n;++i)
    {
     scanf("%d", &v[i]);
     if(v[i] > MAX)
      MAX = v[i];
    }

   for(i=1;i<=n;++i)
    {
     inc(a[i2][v[i]],aux);
     
     for(j=1;j<=MAX;++j)
      if(a[i1][j][0])
       {
        tmp = cmmdc(v[i],j);
        inc(a[i2][tmp],a[i1][j]);
        inc(a[i2][j],  a[i1][j]);
       }

     if(i2==1)
      i2=0,i1=1;
       else
      i2=1,i1=0;
       
     for(j=1;j<=MAX;++j)
      memset(a[i2][j],0,4*(a[i2][j][0]+1));
    }


   for(i=a[i1][1][0]; i>0; --i)
    printf("%d",a[i1][1][i]);

   if(a[i1][1][0] == 0)
    fputs("0\n",stdout);

   return 0;
 }