Cod sursa(job #2413514)

Utilizator alex.cojocaruAlex Cojocaru alex.cojocaru Data 23 aprilie 2019 14:34:23
Problema Indep Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <iostream>

#define NMAX 500
#define VALMAX 1000
#define MAX_CIFRE 200
using namespace std;

class Huge {
  public :
  long long n;
  char cf [ MAX_CIFRE ] ;
  Huge() {
    long long i;
    for(i = 0; i < MAX_CIFRE; i++)
        cf[i] = 0;
    n = 1;
  }
  Huge(long long x) {
    long long i ;
    i = 0 ;
    while (x > 0) {
      cf[i] = x % 10 ;
      i++;
      x /= 10 ;
    }
    n = i ;
    while (i < MAX_CIFRE ) {
      cf[i] = 0 ;
      i++;
    }
  }
  void adun (long long x) {
    long long i, tr ;
    i = 0 ;
    tr = 0 ;
    while (x > 0) {
        cf[i] += tr + x % 10 ;
        tr = cf[i] / 10 ;
        cf[i] = cf[i] % 10 ;
        i++;
        x /= 10 ;
    }
    n = i ;
    while (i < MAX_CIFRE ) {
        cf[i] = 0 ;
        i++;
    }
  }
  Huge operator+(Huge nr) {
    long long i, tr ;
    Huge rez(0) ;
    i = 0 ;
    tr = 0 ;
    while ( (i < n || i < nr.n || tr > 0) && i < MAX_CIFRE ) {
        tr = tr + (cf[i] + nr.cf[i] ) ;
        rez.cf[i] = tr%10 ;
        tr /= 10 ;
        i++;
    }
    rez.n = i ;
    return rez ;
  }
  void puthuge (FILE *fout ) {
    long long i ;
    i = MAX_CIFRE-1;
    while (i > 0 &&cf[i] == 0 )
        i--;
    fprintf (fout, "%d", cf[i] ) ;
    i--;
    while (i >= 0 ) {
        fprintf (fout, "%d", cf[i] ) ;
        i--;
    }
  }
};

long long v [ NMAX + 1 ] ;
Huge v2 [ VALMAX + 1 ] ;

long long gcd (long long a, long long b) {
  long long r ;
  while ( b > 0 ) {
    r = a % b ;
    a = b ;
    b = r ;
  }
  return a ;
}

int main() {
  FILE *fin, *fout ;
  fin = fopen ("indep.in", "r" ) ;
  fout = fopen ("indep.out", "w" ) ;
  long long n, i, j, g ;
  fscanf (fin, "%lld", &n ) ;
  for (i = 0 ; i < n ; i++ ) {
    fscanf (fin, "%lld", &v[i] ) ;
    for (j = 1 ; j <= VALMAX ; j++ ) {
      if (v2[i].n > 0 ) {
        g = gcd (v[i], j) ;
        v2[g] = v2[g] + v2[j] ;
      }
    }
    v2[v[i]].adun(1) ;
  }
  v2[1].puthuge (fout) ;
  return 0;
}