Cod sursa(job #2200049)

Utilizator lucametehauDart Monkey lucametehau Data 30 aprilie 2018 10:11:25
Problema Indep Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <cstdio>
#include <cstring>

using namespace std;

const int lmax = 160;
const int vmax = 1000;
const int base = 1e9;

int n, x;

int unu[2];
int dp[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 /= base)
    a[i] = (t += a[i] + b[i]) % base;
  a[0] = i - 1;
}

int main() {
  freopen("indep.in", "r", stdin);
  freopen("indep.out", "w", stdout);
  scanf("%d", &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++) {
    scanf("%d", &x);
    for(int j = 1; j <= vmax; j++)
      add(dp[cmmdc(j, x)], dp[j]);
    add(dp[x], unu); // elementul insusi
  }
  printf("%d", dp[1][dp[1][0]]);
  for(int i = dp[1][0] - 1; i >= 1; i--)
    printf("%.9d", dp[1][i]);
  return 0;
}