Pagini recente » Cod sursa (job #2172473) | Cod sursa (job #2170035) | Monitorul de evaluare | Cod sursa (job #2694630) | Cod sursa (job #1508739)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <bitset>
#define ll long long
#define maxN 100002
#define maxM 1000002
using namespace std;
int n, i, j, m, mv, v, x[maxM], cop[maxM];
ll sol;
int w[maxM];
bitset < maxM > a;
void read()
{
freopen("pairs.in", "r", stdin);
scanf("%d", &n);
for (i = 1; i <= n; ++ i)
{
scanf("%d", &v);
mv = max(mv, v);
cop[i] = v;
a[v] = 1;
}
for (i = 1; i <= mv; ++ i)
cop[i] = i;
}
void sifter()
{
int l;
for (i = 2; i <= mv; ++ i)
if (!w[i])
{
l = 0;
for (j = i; j <= mv; j += i)
{
++ w[j];
if (a[j] == 1)
++ l;
cop[j] /= i;
}
x[i] = l;
}
else
{
l = 0;
for (j = i; j <= mv; j += i)
l += (a[j] != 0);
x[i] = l;
}
}
ll c(ll x)
{
return ((long long)(x * (x - 1) * 1LL)) / 2;
}
void solve()
{
sifter();
sol = c(n);
for (i = 2; i <= mv; ++ i)
if (cop[i] == 1)
{
if (w[i] % 2)
sol -= c(x[i] * 1LL);
else
sol += c(x[i] * 1LL);
}
}
void write()
{
freopen("pairs.out", "w", stdout);
printf("%lld", sol);
}
int main()
{
read();
solve();
write();
return 0;
}