Cod sursa(job #1042099)

Utilizator AnonymouslegionAnonymous Anonymouslegion Data 26 noiembrie 2013 16:34:24
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

int GCD[1005][1005];
int V1[2], dp[2][1005][155];

int cmmdc(int x, int y){
  int z;
  while(y){
    z = x;
    x = y;
    y = z % y;
  }
  return x;
}

void add(int v1[], int v2[]){
  if(v2[0] == 0)
    return;
  int t = 0, u;
  if(v1[0] < v2[0])
    v1[0] = v2[0];
  for(int i = 1; i <= v2[0]; ++i){
    t += v1[i] + v2[i];
    v1[i] = t % 10;
    t /= 10;
  }
  if(t){
    u = v2[0];
    while(t){
      ++u;
      t += v1[u];
      v1[u] = t % 10;
      t /= 10;
    }
    v1[0] = u;
  }
}

void eq(int v1[], int v2[]){
  for(int i = 1; i <= v1[0]; ++i)
    v1[i] = 0;
  for(int i = 0; i <= v2[0]; ++i)
    v1[i] = v2[i];
}

int main(){
  ifstream in("indep.in");
  ofstream out("indep.out");

  for(int i = 1; i <= 1000; ++i)
    for(int j = 1; j <= 1000; ++j)
      GCD[i][j] = cmmdc(i, j);

  V1[0] = V1[1] = 1;

  int n, mix = 0;
  in >> n;

  for(int i = 1; i <= n; ++i){
    for(int j = 1; j <= mix; ++j)
      eq(dp[i & 1][j], dp[(i + 1) & 1][j]);
    int x;
    in >> x;
    mix = max(x, mix);
    for(int j = 1; j <= mix; ++j)
      add(dp[i & 1][GCD[x][j]], dp[(i + 1) & 1][j]);
    add(dp[i & 1][x], V1);
  }

  for(int i = dp[n & 1][1][0]; i > 0; --i)
    out << dp[n & 1][1][i];

  return 0;
}