Cod sursa(job #2091286)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 19 decembrie 2017 14:49:08
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <stdio.h>

const int nrcf = 17, 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;
}

inline int maxim(int a, int b){
  if(a > b)
    return a;
  return b;
}

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

int main()
{
  FILE *fi = fopen("indep.in", "r"), *fo = fopen("indep.out", "w");
  int n, x;
  fscanf(fi, "%d", &n);
  if(n == 1){
    fscanf(fi, "%d", &n);
    if(n == 1)
      fprintf(fo, "1");
    else
      fprintf(fo, "0");
    return 0;
  }
  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;
  }
  if(d[1 - aux][1].len == 0 && d[1 - aux][1].cf[0] == 0){
    fprintf(fo, "0");
    return 0;
  }
  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;
}