Pagini recente » Cod sursa (job #1688678) | Cod sursa (job #196996) | Cod sursa (job #977728) | Cod sursa (job #1890875) | Cod sursa (job #1631584)
#include <bits/stdc++.h>
using namespace std;
const int base = 1e7;
void Init(vector<int>&a, int x)
{
a.clear();
for(; x ; x /= base)
a.push_back(x % base);
}
void adauga(vector<int> &a, vector<int> b) {
a.resize(max(a.size(), b.size()));
b.resize(max(a.size(), b.size()));
int t = 0;
for(int i = 0; i < (int)a.size(); ++i)
{
a[i] += b[i] + t;
t = a[i] / base;
a[i] %= base;
}
if(t) a.push_back(t);
}
void inmultire(vector<int>&a, int x)
{
int t = 0;
for(auto &val : a)
{
val = val * x + t;
t = val / base;
val %= base;
}
for(; t; t /= base)
a.push_back(t % base);
}
void scadere(vector<int>&a , vector<int> b)
{
b.resize(max(a.size(), b.size()));
int t = 0;
for(int i = 0 ; i < (int)a.size() ; ++i)
{
a[i] = a[i] - b[i] - t;
if(a[i] < 0)
{
a[i] += base;
t = 1;
}
else t = 0;
}
for(; a.size() > 1 && a[a.size() - 1] == 0 ; a.pop_back());
}
void afis(const vector<int>& a)
{
printf("%d", a[a.size() - 1]);
for(int i = a.size() - 2 ; i >= 0 ; --i)
printf("%07d", a[i]);
printf("\n");
}
inline int gcd(int a , int b)
{
if(b == 0)
return a ;
return gcd(b , a % b);
}
int N;
vector<int>A;
void Read()
{
freopen("indep.in", "r", stdin);
scanf("%d", &N);
A = vector<int>(N);
for(int i = 0; i < N; ++i)
scanf("%d", &A[i]);
}
void Solve()
{
vector<int>rasp;
Init(rasp, 1);
for(int i = 0; i < N; ++i)
inmultire(rasp , 2);
vector<vector<int>>dp(N);
for(int i = 0; i < N; ++i)
{
if(A[i] == 1)
continue;
Init(dp[i], 1);
for(int j = i - 1 ; j >= 0 ; --j)
if(gcd(A[i], A[j]) != 1)
adauga(dp[i], dp[j]);
}
vector<int>nonPrimeCnt;
for(int i = 0; i < N; ++i)
adauga(nonPrimeCnt , dp[i]);
scadere(rasp , nonPrimeCnt);
scadere(rasp , vector<int>(1, 1));
freopen("indep.out", "w", stdout);
afis(rasp);
}
int main()
{
Read();
Solve();
}