Cod sursa(job #1585793)

Utilizator claudiuarseneClaudiu Arsene claudiuarsene Data 31 ianuarie 2016 14:44:25
Problema Indep Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <vector>

using namespace std ;

#define MAX 200
#define verf( X, i ) ( i <= X[0] ? X[i] : 0 )
#define A ( *this )

class Mare: protected vector < int > {
    static const int base = 1000000000, nbase = 9;
public:
    Mare();
    Mare(int);

    void operator =  (Mare&);
    void operator += (Mare&);
    void operator ++ (void);
    void write       (void);
};

Mare::Mare() {
  this -> resize ( MAX ) ;
}

Mare::Mare(int X) {
  this -> resize(MAX) ;
  for (A[0] = 0; X; X /= base) {
    A[++A[0]] = X % base;
  }
}

void Mare::operator = (Mare &B) {
  int i;

  A[0] = B[0];
  for (i = 1; i <= A[0]; i++) {
    A[i] = B[i];
  }
}

void Mare::operator += (Mare &B) {
    int i, t = 0;

    for (i = 1; (i <= A[0]) || (i <= B[0]) || (t != 0); i++, t /= base) {
      A[i] = (t += verf(A, i) + verf(B, i)) % base;
    }
    A[0] = i - 1;
}

void Mare::operator ++ (void) {
  Mare B = 1 ;
  A += B ;
}

void Mare::write (void) {
  fprintf(stdout, "%d", A[A[0]]);

  int i;
  for (i = A[0] - 1; i; i--) {
    fprintf(stdout, "%09d", A[i]) ;
  }
}

#define Smerenie 1000

int N;
Mare d[2][Smerenie + 1];
int gcd[Smerenie + 1][Smerenie + 1];

/** gcd(a, b). **/
int cmmdc(int a, int b) {
  return b ? cmmdc(b, a % b) : a;
}

/** Precalculeaza gcd-urile. **/
void init() {
  int i, j;

  for (i = 1; i <= Smerenie; i++) {
    for (j = i; j <= Smerenie; j++) {
      gcd[i][j] = gcd[j][i] = cmmdc(i, j);
    }
  }
}

int main ( void ) {
  int i, j, val, side = 0, write;
  FILE *f = fopen("indep.in", "r");

  //init();

  /* Citirea datelor. */
  fscanf(f, "%d", &N);
  for (i = 1; i <= N; i++) {
    fscanf(f, "%d", &val);

    /* Programare dinamica pe 2 linii. */
    write = (i & 1);
    for (j = 1; j <= Smerenie; j++) {
      d[write][j] = d[side][j];
    }
    for (j = 1; j <= Smerenie; j++) {
      d[write][cmmdc(val, j)] += d[write][j];
    }
    ++d[side = write][val];
  }
  fclose(f);

  /* Afisarea solutiei. */
  freopen("indep.out", "w", stdout);
  d[side][1].write();
  fclose(stdout);

  /// Multumim Doamne!
  puts("Doamne ajuta!");
}