Cod sursa(job #1562493)

Utilizator stoianmihailStoian Mihail stoianmihail Data 5 ianuarie 2016 10:19:28
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <vector>

using namespace std;

#define MAX_SIZE 100
#define check(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);
};

/** Initializare. **/
Mare::Mare() {
  this -> resize(MAX_SIZE) ;
}

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

/** A = B. **/
void Mare::operator = (Mare &B) {
  int i;

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

/** A += B. **/
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 += check(A, i) + check(B, i)) % base;
  }
  A[0] = i - 1;
}

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

/** Afiseaza A. **/
void Mare::write(void) {
  int i;
  if (A[0]) {
    fprintf(stdout, "%d", A[A[0]]);
    for (i = A[0] - 1; i; i--) {
      fprintf(stdout, "%09d", A[i]) ;
    }
  } else {
    fprintf(stdout, "0");
  }
  fputc('\n', stdout);
}

#define Smerenie 1000

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

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

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

  /* 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!");
  return 0;
}