Pagini recente » Cod sursa (job #2624321) | Cod sursa (job #2548392) | Cod sursa (job #769816) | Cod sursa (job #2422596) | Cod sursa (job #866106)
Cod sursa(job #866106)
#include <cstdio>
const int base = int(1e9);
int N, v[512], ans;
int dp[1024][512];
int G[1002][1002];
int one[4];
int gcd(int a,int b) {
if(!b) return a;
return gcd(b,a%b);
}
void add(int a[],int b[]) {
if(a[0] > b[0]) {
for(int i = b[0] + 1;i <= a[0];i++) {
b[i] = 0;
}
} else {
for(int i = a[0] + 1;i <= b[0];i++) {
a[i] = 0;
}
a[0] = b[0];
}
int T = 0;
for(int i = 1;i <= a[0];i++) {
a[i] = a[i] + b[i] + T;
T = a[i]/base;
a[i] %= base;
}
while(T) {
a[++a[0]] = T%base;
T /= base;
}
}
int main()
{
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
scanf("%d",&N);
int valMax = 0;
for(int i = 1;i <= N;++i) {
scanf("%d",&v[i]);
valMax = valMax > v[i] ? valMax : v[i];
}
for(int i = 1;i <= valMax;i++) {
for(int j = 1;j <= i;j++) {
G[i][j] = G[j][i] = gcd(i,j);
}
}
one[0] = one[1] = 1;
for(int i = 1;i <= N;i++) {
for(int j = 1;j <= valMax;j++) {
if(dp[j][0] > 0) {
add(dp[G[j][v[i]]],dp[j]);
}
}
add(dp[v[i]],one);
}
printf("%d",dp[1][dp[1][0]]);
for(int j = dp[1][0] - 1;j >= 1;--j) {
printf("%.9d",dp[1][j]);
}
return 0;
}