Pagini recente » Cod sursa (job #3242039) | Cod sursa (job #3252530) | Cod sursa (job #3193877) | Cod sursa (job #3283715) | Cod sursa (job #3292196)
#include <bits/stdc++.h>
using namespace std;
const long long M_MAX = 1e6 + 5, MAX_PRIME = 1e3 + 10;
void SetInput(string name)
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
(void)!freopen((name + ".in").c_str(), "r", stdin);
(void)!freopen((name + ".out").c_str(), "w", stdout);
}
int fr[M_MAX];
int lp[M_MAX];
vector<int> primes;
int mob[M_MAX];
int CalcMob(int x)
{
int cnt = 0;
while(x != 1)
{
int p = lp[x];
cnt++;
x /= p;
if(x % p == 0)
return 0;
}
if(cnt % 2 == 1)
return -1;
else
return 1;
}
void PrecalcMobius()
{
mob[1] = 1;
for(int i = 2; i < M_MAX; i++)
{
if(lp[i] == 0)
{
lp[i] = i;
primes.push_back(i);
}
for(unsigned int j = 0; j < primes.size() && i * primes[j] < M_MAX && primes[j] <= lp[i]; j++)
lp[i * primes[j]] = primes[j];
mob[i] = CalcMob(i);
}
}
inline long long Comb2(const int& n)
{
return 1LL * n * (n - 1) / 2;
}
void Solve()
{
int N, M = 0;
cin >> N;
for(int i = 1, x; i <= N; i++)
{
cin >> x;
M = max(M, x);
fr[x] = 1;
}
long long sol = Comb2(N);
for(int i = 2; i <= M; i++)
if(mob[i] != 0)
{
int multiples = 0;
for(int j = i; j <= M; j += i)
multiples += fr[j];
long long pairs = Comb2(multiples);
sol += mob[i] * pairs;
}
cout << sol << '\n';
}
int main()
{
SetInput("pairs");
PrecalcMobius();
Solve();
return 0;
}