Cod sursa(job #84977)

Utilizator VmanDuta Vlad Vman Data 18 septembrie 2007 23:48:26
Problema Indep Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <stdio.h>
using namespace std;
#define Nmax 500
#define Dmax 1001
#define Lmax 100
#define baza 100000000

struct numar { int c[Lmax]; };

int N;
int X[Nmax];
numar A[2][Dmax];

void citire()
{
 int i;
 freopen("indep.in","r",stdin);
 scanf("%d",&N);
 for (i=0;i<N;++i)
     scanf("%d",&X[i]);
 fclose(stdin);
}

void aduna(numar &N1, numar N2)
{
 int i,r=0,rr=0;
 for (i=1;i<=N2.c[0];++i)
     {
      rr=(N1.c[i]+N2.c[i]+r)/baza;
      N1.c[i]=(N1.c[i]+N2.c[i]+r)%baza;
      r=rr;
     }
 --i;
 while (r>0)
       {
        ++i;
        rr=(N1.c[i]+r)/baza;
        N1.c[i]=(N1.c[i]+r)%baza;
        r=rr;
       }
 if (i>N1.c[0]) N1.c[0]=i;
}

int cmmdc(int A,int B)
{
 int r;
 do
       {
        r=A%B;
        A=B;
        B=r;
       }
 while (r>0);
 return A;
}

void afisare(int rr)
{
 int i,r;
 freopen("indep.out","w",stdout);
 printf("%d",A[rr][1].c[A[rr][1].c[0]]);
 for (i=A[rr][1].c[0]-1;i>0;--i)
     {
      r=baza/10;
      while (A[rr][1].c[i]<r)
       {
            printf("%d",0);
            r/=10;
       }
      if (r>0) printf("%d",A[rr][1].c[i]);
     }
 fclose(stdout);
}


void dinamica()
{
 int i,j,d,k,r=0;
 for (i=0;i<N;++i)
     {
      r=1-r;
      for (j=1;j<Dmax;++j)
         {
          for (k=1;k<=A[r][j].c[0];++k)
            A[r][j].c[k]=0;
          A[r][j].c[0]=0;
         }
      A[r][X[i]].c[0]=1;
      A[r][X[i]].c[1]=1;
      for (j=1;j<Dmax;++j)
         {
          d=cmmdc(j,X[i]);
          aduna(A[r][d],A[1-r][j]);
          aduna(A[r][j],A[1-r][j]);
         }
     }
afisare(r);
}

int main()
{
 citire();
 dinamica();
 return 0;
}