Pagini recente » Cod sursa (job #738254) | Cod sursa (job #273300) | Cod sursa (job #1903282) | Cod sursa (job #1468359) | Cod sursa (job #1442472)
/*
If you can't explain it simply, you don't understand it well enough.
*/
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int base = 10000;
const int Nmax = 510;
const int Vmax = 1010;
int n , i , j , crt , Max;
int a[Nmax];
vector < int > d[2][Vmax] , aux;
int cmmdc(int a , int b)
{
int r = a % b;
while (r)
{
a = b;
b = r;
r = a % b;
}
return b;
}
void suma(vector < int > &A , vector < int > B)
{
int i , T = 0 , A0 = A.size() , B0 = B.size();
for (i = A0; i < B0; A.push_back(0), ++i);
for (i = B0; i < A0; B.push_back(0), ++i);
A0 = max(A0 , B0);
for (i = 0; i < A0; ++i)
{
A[i] += B[i] + T;
T = A[i] / base;
A[i] %= base;
}
if (T) A.push_back(T);
}
int main()
{
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
for (scanf("%d", &n), i = 1; i <= n; ++i)
scanf("%d", &a[i]),
Max = max(Max , a[i]);
aux.push_back(1);
for (crt = 1, i = 1; i <= n; crt ^= 1, ++i)
{
for (j = 1; j <= Max; ++j)
d[crt][j].clear();
for (j = 1; j <= Max; ++j)
suma(d[crt][j] , d[crt^1][j]),
suma(d[crt][cmmdc(a[i] , j)] , d[crt^1][j]);
suma(d[crt][a[i]] , aux);
}
aux[0] = 0; crt ^= 1;
suma(d[crt][1] , aux);
printf("%d", d[crt][1].back()); d[crt][1].pop_back();
for ( ; d[crt][1].size(); d[crt][1].pop_back())
printf("%.4d", d[crt][1].back());
return 0;
}