Pagini recente » Monitorul de evaluare | Cod sursa (job #2009449) | Cod sursa (job #1470232) | Cod sursa (job #2046351) | Cod sursa (job #494879)
Cod sursa(job #494879)
#include <fstream>
#include <algorithm>
using namespace std;
int N;
int V[200002], divX[1000002];
int Max;
bool is[1000002], prim[1000002], facP[1000002], can[1000002]; // facP - ma folosesc de overflow.
long long tot;
int main()
{
ifstream fin("pairs.in");
ofstream fout("pairs.out");
fin >> N;
for (int i = 1; i <= N; ++i)
{
fin >> V[i];
is[V[i]] = true;
Max = max(Max, V[i]);
}
divX[1] = N;
for (int i = 2; i <= Max; ++i)
{
divX[i] = is[i];
for (int j = 2; i * j <= Max; ++j)
divX[i] += is[i * j];
if (!prim[i])
{
facP[i] = ~facP[i];
for (int j = 2; i * j <= Max; ++j)
{
prim[i * j] = true;
facP[i * j] = ~facP[i];
can[i * j] |= (j % i == 0);
}
}
}
for (int i = 2; i <= Max; ++i)
if (can[i] == false)
tot += (facP[i] == true ? 1 : -1) * (long long) divX[i] * (long long) (divX[i] - 1) / 2;
long long sol = (long long) N * (N - 1) / 2;
fout << sol - tot;
fin.close();
fout.close();
}