Pagini recente » Cod sursa (job #842421) | Cod sursa (job #1799293) | Cod sursa (job #2927864) | Cod sursa (job #14239) | Cod sursa (job #1398971)
#include <iostream>
#include <fstream>
#include <bitset>
using namespace std;
ifstream in ("pairs.in");
ofstream out ("pairs.out");
const int MAX = 1000000 + 10;
bitset <MAX> NotPrime;//NotPrime[i] = 1 daca i NU este prim
bitset <MAX> Use;//daca se gaseste in multimea M
bitset <MAX> Bad;//daca in descompunerea lui i apare un factor prim la putere > 1, atunci Bad[i] = 1
int NrDiv[MAX];
int main()
{
int N, Max = 0, i, x, j;
in >> N;
for (i = 1; i <= N; i ++){
in >> x;
Use[x] = 1;
if (x > Max)
Max = x;
}
for (i = 2; i <= Max; i ++)
if (!NotPrime[i]){
for (j = i; j <= MAX; j += i){
NrDiv[j] ++;
NotPrime[j] = 1;
if (j % (i * i) == 0)
Bad[j] = 1;
}
}
long long Ans = 0;
int now;
for (i = 2; i <= Max; i ++)
if (!Bad[i]){
now = 0;
for (j = i; j <= Max; j += i)
now += Use[j];
if (NrDiv[i] % 2 == 0)
Ans -= (1LL * now * (now - 1) / 2);
else
Ans += (1LL * now * (now - 1) / 2);
}
Ans = 1LL * N * (N - 1) / 2 - Ans;
out << Ans;
return 0;
}