Pagini recente » Cod sursa (job #1170567) | Cod sursa (job #1125833) | Cod sursa (job #1294805) | Cod sursa (job #1135232) | Cod sursa (job #1111944)
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
using namespace std;
int n, gcd[1005][1005];
inline int fgcd(int a, int b) {
if (!b) return a;
return fgcd(b, a % b);
}
const int base = 1000 * 1000 * 1000;
int dp[1005][205], unu[205];
void add(int A[], int B[]) {
int i, t = 0;
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 digits(int a) {
int r = 0;
while (a) {
a /= 10;
++r;
}
return r;
}
void write(int a) {
int d = digits(a);
for (int i = 9 - d; i > 0; --i)
cout << '0';
cout << a;
}
int main() {
#ifdef INFOARENA
ifstream cin("indep.in");
ofstream cout("indep.out");
#endif
for (int i = 1; i <= 1000; ++i)
for (int j = 1; j <= 1000; ++j)
gcd[i][j] = fgcd(i, j);
unu[0] = unu[1] = 1;
cin >> n;
for (int ni = 1; ni <= n; ++ni) {
int a;
cin >> a;
for (int i = 1; i <= 1000; ++i)
add(dp[gcd[i][a]], dp[i]);
add(dp[a], unu);
}
int crl = n % 2;
cout << dp[1][dp[1][0]];
for (int i = dp[1][0] - 1; i >= 1; --i)
write(dp[1][i]);
}