Cod sursa(job #84978)

Utilizator VmanDuta Vlad Vman Data 18 septembrie 2007 23:59:06
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <stdio.h>
#include <string.h>
using namespace std;
#define Nmax 500
#define Dmax 1001
#define Lmax 30
#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)
         {
          memcpy(A[r][j].c,A[1-r][j].c,sizeof(A[1-r][j].c));
         }
      A[r][X[i]].c[1]+=1;
      j=1;
      while (A[r][X[i]].c[j]>baza)
            {
             A[r][X[i]].c[j]-=baza;
             ++A[r][X[i]].c[++j];
            }
      if (j>A[r][X[i]].c[0]) A[r][X[i]].c[0]=j;
      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;
}