Pagini recente » Cod sursa (job #1424108) | Cod sursa (job #1770973) | Cod sursa (job #2178982) | Cod sursa (job #1233203) | Cod sursa (job #1042106)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
int GCD[1005][1005];
int V1[2], dp[2][1005][155];
int cmmdc(int x, int y){
int z;
while(y){
z = x;
x = y;
y = z % y;
}
return x;
}
void add(int v1[], int v2[]){
if(v2[0] == 0)
return;
int t = 0, u;
if(v1[0] < v2[0])
v1[0] = v2[0];
for(int i = 1; i <= v2[0]; ++i){
t += v1[i] + v2[i];
v1[i] = t % 10;
t /= 10;
}
if(t){
u = v2[0];
while(t){
++u;
t += v1[u];
v1[u] = t % 10;
t /= 10;
}
if(v1[0] < u)
v1[0] = u;
}
}
void eq(int v1[], int v2[]){
for(int i = 1; i <= v1[0]; ++i)
v1[i] = 0;
for(int i = 0; i <= v2[0]; ++i)
v1[i] = v2[i];
}
int main(){
ifstream in("indep.in");
ofstream out("indep.out");
for(int i = 1; i <= 1000; ++i)
for(int j = 1; j <= 1000; ++j)
GCD[i][j] = cmmdc(i, j);
V1[0] = V1[1] = 1;
int n, mix = 0;
in >> n;
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= mix; ++j)
eq(dp[i & 1][j], dp[(i + 1) & 1][j]);
int x;
in >> x;
mix = max(x, mix);
for(int j = 1; j <= mix; ++j)
add(dp[i & 1][GCD[x][j]], dp[(i + 1) & 1][j]);
add(dp[i & 1][x], V1);
}
if(dp[n & 1][1][0] == 0)
out << "0";
for(int i = dp[n & 1][1][0]; i > 0; --i)
out << dp[n & 1][1][i];
return 0;
}