Cod sursa(job #2091266)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 19 decembrie 2017 13:57:17
Problema Indep Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <stdio.h>

const int nrcf = 100, lim = 1001, bz = (int) 1e9;

inline int func(int a, int b){
  int r;
  while(b > 0){
    r = a % b;
    a = b;
    b = r;
  }
  return a;
}

struct mare{
  int cf[nrcf + 1];
  int len;
  void init(){
    len = 0;
    for(int i = 0; i < nrcf; i++)
      cf[i] = 0;
  }
  mare operator +(mare b){
    mare ans;
    ans.init();
    for(int i = 0; i < nrcf; i++){
      ans.cf[i] += cf[i] + b.cf[i];
      ans.cf[i + 1] = ans.cf[i] / bz;
      ans.cf[i] %= bz;
      if(ans.cf[i] != 0)
        ans.len = i + 1;
    }
    return ans;
  }
  void operator =(mare b){
    len = b.len;
    for(int i = 0; i < nrcf; i++)
      cf[i] = b.cf[i];
  }
  mare operator *(int b){
    mare ans;
    ans.init();
    ans = *this;
    int tr = 0;
    for(int i = 0; i < nrcf; i++){
      ans.cf[i] *= b;
      ans.cf[i] += tr;
      tr = ans.cf[i] / bz;
      ans.cf[i] %= bz;
      if(ans.cf[i] != 0)
        ans.len = i + 1;
    }
    return ans;
  }
};
mare d[2][lim];

int main()
{
  FILE *fi = fopen("indep.in", "r"), *fo = fopen("indep.out", "w");
  int n, x;
  fscanf(fi, "%d", &n);
  int aux = 0;
  mare unu;
  unu.init();
  unu.len = 1; unu.cf[0] = 1;
  for(int i = 0; i < n; i++){
    fscanf(fi, "%d", &x);
    for(int j = 1; j <= 1000; j++)
      d[aux][j] = d[1 - aux][j];
    for(int j = 1; j <= 1000; j++){
      int cmmdc = func(x, j);
      d[aux][cmmdc] = d[aux][cmmdc] + d[1 - aux][j];
    }
    d[aux][x] = d[aux][x] + unu;
    aux = 1 - aux;
  }
  mare ans = d[1 - aux][1];
  fprintf(fo, "%d", ans.cf[ans.len - 1]);
  for(int i = ans.len - 2; i >= 0; i--)
    fprintf(fo, "%09d", ans.cf[i]);
  return 0;
}