Pagini recente » Cod sursa (job #2998854) | Cod sursa (job #1157678) | Cod sursa (job #3273882) | Cod sursa (job #2199466) | Cod sursa (job #921104)
Cod sursa(job #921104)
#include <fstream>
using namespace std;
ifstream f("pairs.in");
ofstream g("pairs.out");
const int MAX_N = 100005;
const int MAX_VAL = 1000000;
int n, a[MAX_N], prim[MAX_VAL], X[MAX_VAL];
long long rez;
bool frecv[MAX_VAL], bad[MAX_VAL];
void ciur() {
for (int i = 2; i <= MAX_VAL; i++)
if (prim[i] == 0) // e prim
for (int j = i; j <= MAX_VAL; j += i)
prim[j]++;
}
void read() {
f >> n;
for (int i = 1; i <= n; i++) {
f >> a[i];
frecv[a[i]] = 1;
}
}
void solve() {
for (int i = 2; i * i <= MAX_VAL; i++)
if (prim[i] == 1) {
for (int j = i * i; j <= MAX_VAL; j += i * i) // merg din i^2 in 2 * i^2 in 3 * i^2
bad[j] = 1;
}
for (int i = 2; i <= MAX_VAL; i++)
if (!bad[i]) { // daca i e produs de numere prime care apar doar o data
for (int j = i; j <= MAX_VAL; j++)
if (frecv[j])
X[i]++; // X[i] = numarul de numere din M divizibile cu i
}
for (int i = 2; i <= MAX_VAL; i++)
if (prim[i] % 2 == 0)
rez = rez - 1LL * X[i] * (X[i] - 1) / 2;
else
rez = rez + 1LL * X[i] * (X[i] - 1) / 2;
rez = 1LL * n * (n - 1) / 2 - rez;
}
int main() {
ciur();
read();
solve();
g << rez << '\n';
f.close();
g.close();
return 0;
}