Cod sursa(job #2200044)

Utilizator lucametehauDart Monkey lucametehau Data 30 aprilie 2018 09:50:55
Problema Indep Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream cin ("indep.in");
ofstream cout ("indep.out");

const int lmax = 160;
const int vmax = 1000;

int n, x;

int unu[2];
int dp[2][1 + vmax][1 + lmax];

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

void add(int a[], int b[]) {
  int t = 0, i;
  for(i = 1; i <= a[0] || i <= b[0] || t; i++, t /= 10)
    a[i] = (t += a[i] + b[i]) % 10;
  a[0] = i - 1;
}

int main() {
  cin >> n;
  // dp[i][j] = nr de subsiruri formate din primele i elemente care au cmmdc-ul j
  unu[0] = unu[1] = 1;
  for(int i = 1; i <= n; i++) {
    cin >> x;
    for(int j = 1; j <= vmax; j++) {
      memset(dp[i % 2][j], 0, sizeof(dp[i % 2][j]));
      add(dp[i % 2][j], dp[1 - i % 2][j]);
      add(dp[i % 2][cmmdc(j, x)], dp[1 - i % 2][j]);
    }
    add(dp[i % 2][x], unu); // elementul insusi
  }
  for(int i = dp[n % 2][1][0]; i >= 1; i--)
    cout << dp[n % 2][1][i];
  if(dp[n % 2][1][0] == 0)
    cout << 0;
  return 0;
}