Cod sursa(job #63030)

Utilizator info_arrandrei gigea info_arr Data 25 mai 2007 19:20:30
Problema Indep Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
using namespace std;

#define nmax 505
#define bas 10
#define dmax 100

#include<stdio.h>
#include<fstream>

FILE *fin=fopen("indep.in","r"),
     *fout=fopen("indep.out","w");

struct bignum
 {
   int n;
   int x[dmax];
 };  

int a[nmax],c[nmax*2],n,i,j;
long long opt[nmax][nmax];
int cm;

 int euclid(int a, int b)  
  { 
    int c;  
    while (b) {  
     c = a % b;  a = b;  b = c; } 
   return a;
   } 
   
int max(int a, int b)
 { if (a>b) return a; else return b; }   

   
void add(bignum &a, bignum b, bignum c)
{
   int t=0,i;
   a.n=max(b.n,c.n);  
   for (i=1; i<=a.n; i++)
    {
      t+=b.x[i]+c.x[i];
      a.n=t%bas;
      t=t/bas;
    }  
   if (t>0) { a.n++; a.x[a.n]=t; }
   return; 
}   
int o;   

int main()
{
  fscanf(fin,"%d\n",&n);
  int m=0;
  for (i=1; i<=n; i++)  
    { 
       fscanf(fin,"%d\n",&a[i]); 
       if (a[i]>m) m=a[i];
       c[a[i]]++; 
    } 
  for (j=1; j<=1000; j++) if (a[1]%j==0) opt[1][j]=1;  
  for (i=2; i<=n; i++)
  {   
   for (j=1; j<=1000;j++)
    {
      cm=euclid(j,a[i]);
      opt[i][cm]=opt[i-1][j]+opt[i-1][cm];
    }
   if (c[i]>0)
    for (j=1; j<=1000; j++) opt[i][j]++; 
  }   
  fprintf(fout,"%lld\n",opt[n][1]);  
fclose(fin);
fclose(fout);

  return 0;
}