Pagini recente » Cod sursa (job #142902) | Cod sursa (job #498157) | Cod sursa (job #923686) | Cod sursa (job #733018) | Cod sursa (job #164362)
Cod sursa(job #164362)
#include <cstdio>
#include <bitset>
#include <vector>
using namespace std;
#define maxV 1001
#define maxN 501
#define pb push_back
bitset <maxV> U;
vector <int> V;
vector <int> R[maxN][maxV];
vector <int> Add(vector <int> A, vector <int> B)
{
int i, j, t = 0;
vector <int> R;
R.clear();
for(i=j=0; i<A.size() || j<B.size() || t; ++i, ++j)
{
if(i < A.size()) t += A[i];
if(j < B.size()) t += B[j];
R.pb(t%10);
t /= 10;
}
while(R.size() && !R[R.size()-1]) R.pop_back();
return R;
}
int Cmmdc(int x, int y)
{
int r;
while(y)
{
r = x % y;
x = y;
y = r;
}
return x;
}
int main()
{
freopen("indep.in", "rt", stdin);
freopen("indep.out", "wt", stdout);
int i, n, x, max = 0;
for(scanf("%d", &n), i=1; i<=n; ++i)
{
scanf("%d", &x);
max = x > max ? x : max;
// if(!U[x])
// {
// U[x] = 1;
V.pb(x);
// }
}
vector <int> :: iterator it = V.begin();
R[1][*it].pb(1);
int j, c;
for(++it, i=2; it!=V.end(); ++i, ++it)
{
for(j=1; j<=max; ++j)
if(R[i-1][j].size())
{
R[i][j] = R[i-1][j];
c = Cmmdc(j, *it);
R[i][c] = Add(R[i][c], R[i-1][j]);
}
vector <int> One;
One.clear();
One.pb(1);
R[i][*it] = Add(R[i][*it], One);
}
if(!R[i-1][1].size()) printf("0");
else
for(j=R[i-1][1].size()-1; j>=0; --j) printf("%d", R[i-1][1][j]);
return 0;
}