Pagini recente » Cod sursa (job #956400) | Cod sursa (job #1484220) | Cod sursa (job #1855570) | Cod sursa (job #1316960) | Cod sursa (job #1993299)
#include <bits/stdc++.h>
#define MAXVAL 1000
#define SIZE 200
#define BASE 10000
int dp[2][MAXVAL + 1][SIZE];
short dig[2][MAXVAL + 1];
inline int gcd(int a, int b) {
int r;
while(b > 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
int main() {
std::ifstream cin("indep.in");
std::ofstream cout("indep.out");
int i, n, val, j, sz, k, x, t;
std::ios::sync_with_stdio(false);
cin >> n;
dig[0][0] = 1;
dp[0][0][0] = 1;
for(i = 1; i <= n; i++) {
cin >> val;
memset(dp[i & 1], 0, sizeof(dp[i & 1]));
memset(dig[i & 1], 0, sizeof(dig[i & 1]));
for(j = 0; j <= MAXVAL; j++) {
x = gcd(val, j);
sz = std::max(dig[i & 1][x], dig[1 - i & 1][j]);
t = 0;
for(k = 0; k < sz || t > 0; k++) {
t = t + dp[i & 1][x][k] + dp[1 - i & 1][j][k];
dp[i & 1][x][k] = t % BASE;
t /= BASE;
}
dig[i & 1][x] = k;
}
for(j = 0; j <= MAXVAL; j++) {
sz = std::max(dig[i & 1][j], dig[1 - i & 1][j]);
t = 0;
for(k = 0; k < sz || t > 0; k++) {
t = t + dp[1 - i & 1][j][k] + dp[i & 1][j][k];
dp[i & 1][j][k] = t % BASE;
t /= BASE;
}
dig[i & 1][j] = k;
}
}
for(i = dig[n & 1][1] - 1; i >= 0; i--) {
val = dp[n & 1][1][i];
sz = 0;
if(val == 0)
sz = 1;
while(val > 0) {
val /= 10;
sz++;
}
if(i < dig[n & 1][1] - 1)
while(sz < 4) {
cout << 0;
sz++;
}
cout << dp[n & 1][1][i];
}
cin.close();
cout.close();
return 0;
}