Pagini recente » Borderou de evaluare (job #752893) | Borderou de evaluare (job #3224892) | Borderou de evaluare (job #202311) | Borderou de evaluare (job #2623193) | Cod sursa (job #2501178)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("pairs.in");
ofstream out("pairs.out");
int n;
bool f[1000005];
bool ciur[1000005];
long long ans;
vector<int> primes;
int countDiv(int prod)
{
int cnt = 0;
for (int i = prod; i <= 1000000; i += prod)
cnt += f[i];
return cnt;
}
void back(int prod, int cnt, int last)
{
if (prod != 1)
{
int x = countDiv(prod);
int per = 1LL * x * (x - 1) / 2;
if (cnt % 2 == 1)
per = -per;
ans += per;
}
for (int i = last + 1; i < primes.size(); i++)
if (1000000 / prod >= primes[i])
back(prod * primes[i], cnt + 1, i);
}
int main()
{
in >> n;
for (int i = 1; i <= n; i++)
{
int x;
in >> x;
f[x] = 1;
}
ans = 1LL * n * (n - 1) / 2;
for (int i = 2; i * i <= 1000000; i++)
{
if (!ciur[i])
{
primes.push_back(i);
for (int j = i * i; j * j <= 1000000; j += i)
ciur[j] = 1;
}
}
back(1, 0, -1);
out << ans;
}