Pagini recente » Cod sursa (job #2168196) | Cod sursa (job #1307965) | Cod sursa (job #361149) | Cod sursa (job #163030) | Cod sursa (job #2200053)
#include <cstdio>
#include <cstring>
using namespace std;
const int lmax = 160;
const int vmax = 1000;
const int base = 1e9;
int n, x;
int unu[1 + lmax];
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;
}