Pagini recente » Cod sursa (job #2034028) | Cod sursa (job #494075) | Cod sursa (job #1099656) | Cod sursa (job #273677) | Cod sursa (job #2192805)
#define DM (int) 1e6+1
#include <bitset>
#include <fstream>
#include <vector>
using namespace std;
ifstream fi ("pairs.in");
ofstream fo ("pairs.out");
bitset <DM> bs, v;
int n, a, p[DM], mx;
long long tot;
vector <int> dv;
void pinex()
{
int bz = (1 << dv.size()) - 1, msk, pr, aux;
for (msk = 1; msk <= bz; ++msk)
{
aux = 1;
pr = 0;
for (int vf = 0; vf < dv.size(); ++vf)
if (msk & (1 << vf))
{
aux *= dv[vf];
++pr;
}
if (pr&1)
tot += 1LL*p[aux]*(p[aux] - 1)/2;
else
tot -= 1LL*p[aux]*(p[aux] - 1)/2;
}
}
void ciur()
{
//vanilla
bs[1] = 1;
for (int i = 2; i*i <= mx; ++i)
if (!bs[i])
for (int j = i*i; j <= mx; j += i)
bs[j] = 1;
}
int main()
{
fi >> n;
for (int i = 1; i <= n; ++i)
{
fi >> a;
v[a] = 1;
mx = max(mx, a);
}
ciur();
for (int i = 2; i <= mx; ++i)
{
for (int j = 1; j*i <= mx; ++j)
if (v[i*j])
++p[i];
if (!bs[i] && p[i])
dv.push_back(i);
}
pinex();
fo << n*(n - 1)/2 - tot;
return 0;
}