Pagini recente » Cod sursa (job #2950481) | Cod sursa (job #629719) | Cod sursa (job #2210192) | Cod sursa (job #3221009) | Cod sursa (job #2200044)
#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;
}