Pagini recente » Cod sursa (job #162277) | Cod sursa (job #2351257) | Cod sursa (job #2439472) | Cod sursa (job #223736) | Cod sursa (job #3125955)
#include <bits/stdc++.h>
using namespace std;
ifstream in("pairs.in");
ofstream out("pairs.out");
int n,a[100005],fr[1000005];
bool sieve[1000005];
int mobius[1000005];
vector<int>primes;
void prec()
{
for (int i = 2; i <= 1000000; i++)
if (!sieve[i])
for (int j = 2 * i; j <= 1000000; j += i)
sieve[j] = true;
for (int i = 2; i <= 1000000; i++)
if (!sieve[i])
primes.push_back(i);
for (int i = 1; i <= 1000000; i++)
mobius[i] = -1;
for (int i = 0; i < primes.size(); i++)
for (int j = primes[i]; j <= 1000000; j += primes[i])
mobius[j] = -mobius[j];
for (int i = 0; primes[i] * primes[i] <= 1000000; i++)
for (int j = primes[i] * primes[i]; j <= 1000000; j += primes[i] * primes[i])
mobius[j] = 0;
}
int main()
{
prec();
in >> n;
for (int i = 1; i <= n; i++)
in >> a[i],fr[a[i]]++;
long long ans = 0;
for (int i = 1; i <= 1000000; i++)
{
int cate = 0;
for (int j = i; j <= 1000000; j += i)
cate += fr[j];
ans += 1ll * cate * (cate - 1) / 2ll * mobius[i];
}
out << -ans;
return 0;
}
/**
perechea (a b) o numar la d | gcd(a,b) astfel:
la un factor prim cu +
la doi factori primi cu -
...
daca nu e liber de patrate cu 0
i.e cu mobius[d]
**/