Cod sursa(job #1235378)

Utilizator hrazvanHarsan Razvan hrazvan Data 29 septembrie 2014 18:14:22
Problema Indep Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
#define MAX 1000000000
#define MAXN 500
#define MAXEL 1000
#define MAXL 200
int v[MAXN];
int d[MAXEL + 1][MAXL], len[MAXEL + 1];

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

void add(int *v1, int l1, int *v2, int *l2){
  int i, max = l1;
  if(max < *l2)  max = *l2;
  for(i = 0; i < max; i++)   v2[i] += v1[i];
  i = 0;
  while(i < max || v2[i] != 0){
    v2[i + 1] += v2[i] / MAX;
    v2[i] %= MAX;
    if(i > *l2)  *l2 = i;
    i++;
  }
  if(v2[*l2] != 0)  (*l2)++;
}

int main(){
  FILE *in = fopen("indep.in", "r");
  int n, i, j;
  fscanf(in, "%d", &n);
  for(i = 0; i < n; i++){
    fscanf(in, "%d", &v[i]);
  }
  fclose(in);
  int a, unu[1] = {1};
  for(i = 0; i < n; i++){
    for(j = 1; j <= MAXEL; j++){
      a = cmmdc(j, v[i]);
      add(d[j], len[j], d[a], &len[a]);
    }
    add(unu, 1, d[v[i]], &len[v[i]]);
  }
  FILE *out = fopen("indep.out", "w");
  for(i = 0; i < len[1]; i++){
    fprintf(out, "%d", d[1][i]);
  }
  if(len[1] == 0)  fputc('0', out);
  fclose(out);
  return 0;
}