Pagini recente » Cod sursa (job #1548201) | Cod sursa (job #2153948) | Cod sursa (job #1837445) | Cod sursa (job #1035106) | Cod sursa (job #919085)
Cod sursa(job #919085)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
#define NMAX 1000100
#define pb push_back
typedef long long lol;
ifstream fin("pairs.in");
ofstream fout("pairs.out");
int n, rd;
int sum[NMAX];
int pn[NMAX];
bool prime[NMAX];
vector<int> div;
inline void makePrime()
{
for (int i = 2; i < NMAX; i++)
{
if (prime[i] == false)
{
for (int j = min(1LL * NMAX, 1LL * i * i); j < NMAX; j += i)
prime[j] = true;
pn[++pn[0]] = i;
}
}
}
inline void makeDiv(lol number)
{
div.clear();
int d = number;
for (int i = 1; pn[i] * pn[i] <= number && d > 1; i++)
{
if (d % pn[i] == 0)
{
div.pb(pn[i]);
while (d % pn[i] == 0)
d /= pn[i];
}
}
if (d > 1) div.pb(d);
}
int main()
{
fin >> n; makePrime(); lol sol = 0;
for (int i = 1; i <= n; i++)
{
fin >> rd;
makeDiv(rd);
int size = div.size();
for (int i = 1; i < (1 << size); i++)
{
int num = 1, sign = 1;
for (int j = 0; j < size; j++)
if (i & (1 << j))
num = num * div[j], sign = -sign;
sol = sol + sum[num] * sign;
sum[num]++;
}
}
sol += 1LL * n * (n - 1) / 2;
fout << sol << '\n';
fout.close();
return 0;
}