Pagini recente » Cod sursa (job #1629231) | Cod sursa (job #2286138) | Cod sursa (job #953521) | Cod sursa (job #1732100) | Cod sursa (job #235933)
Cod sursa(job #235933)
#include <stdio.h>
#include <algorithm>
#define bz_num 1000000000
#define mx 1024
#define ll long long
using namespace std;
int n, mm;
int a[mx];
int sol[mx][mx], ad[mx][mx], cmmdc[mx][mx];
int gcd(int f_rez, int b)
{
while (b)
{
int c = f_rez % b;
f_rez = b;
b = c;
}
return f_rez;
}
void aduna(int *vct_sum, int vct_ter[])
{
ll i, t = 0;
for (i = 1; i <= max(vct_sum[0], vct_ter[0]) || t; i++, t /= (ll) bz_num)
vct_sum[i] = (t += (ll) vct_sum[i] + vct_ter[i]) % bz_num;
vct_sum[0] = i - 1;
}
int main()
{
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
scanf("%ld", &n);
for (int i = 1; i <= 1000; i++)
for (int j = 1; j <= 1000; j++)
cmmdc[i][j] = cmmdc[j][i] = gcd(i, j);
for (int i = 1; i <= n; i++)
scanf("%ld", &a[i]);
sort(a + 1, a + 1 + n);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= mm; j++)
{
for (int k = 1; k <= ad[j][0]; k++)
ad[j][k] = 0;
ad[j][0] = 1;
ad[j][1] = 0;
}
ad[a[i]][0] = ad[a[i]][1] = 1;
for (int j = 1; j <= mm; j++)
aduna(ad[cmmdc[a[i]][j]], sol[j]);
mm = max(mm, a[i]);
for (int j = 1; j <= mm; aduna(sol[j], ad[j]), j++);
}
printf("%ld", sol[1][sol[1][0]]);
for (; sol[1][0] - 1; sol[1][0]--)
printf("%09ld", sol[1][sol[1][0] - 1]);
fclose(stdin);
fclose(stdout);
return 0;
}