Pagini recente » Cod sursa (job #365665) | Cod sursa (job #485119) | Cod sursa (job #2288070) | Cod sursa (job #1051992) | Cod sursa (job #3146697)
#include <fstream>
#include <vector>
#define int long long
using namespace std;
ifstream cin("indep.in");
ofstream cout("indep.out");
const int NMAX = 1001;
int N, Fact[NMAX+1], ans, finalans;
vector<int> prime;
bool eprim[NMAX+1];
void eratostene()
{
for(int i = 3; i <= NMAX; i+= 2)
{
if(eprim[i] == 0)
for(int j = i + i; j <= NMAX; j += i)
eprim[j] = 1;
}
prime.push_back(2);
for(int i = 3; i <= NMAX; i++)
{
if(eprim[i] == 0 && i % 2)
prime.push_back(i);
}
}
void rez(vector<int> &sub, int n, vector<int> &factori)
{
int P = 1;
for(int i = 1; i <= n; i++)
P = P * factori[sub[i]];
if(n % 2 == 1)
{
ans += (1 << Fact[P]);
}
else
ans -= (1 << Fact[P]);
Fact[P]++;
}
void Back(vector<int> &sub, int k, vector<int> &elem)
{
for(int i = sub[k-1] + 1; i < elem.size(); i++)
{
sub[k] = i;
rez(sub,k,elem);
if(k < elem.size())
{
Back(sub, k + 1, elem);
}
}
}
void Desc(int B)
{
vector<int> factoriprimi;
int ind = 0, d = prime[0];
while(B != 1)
{
if(B % d == 0)
{
factoriprimi.push_back(d);
while(B % d == 0)
B /= d;
}
if(prime[ind+1] * prime[ind+1] > B)
d = B;
else d = prime[++ind];
}
vector<int> submultimi(factoriprimi.size()+1);
submultimi[0] = -1;
Back(submultimi, 1, factoriprimi);
}
signed main()
{
eratostene();
cin >> N;
for(int i = 1; i <= N; i++)
{
int x, B;
cin >> x;
ans = 0;
B = x;
Desc(B);
finalans += (1 << (i-1)) - ans;
}
cout << finalans;
}