Pagini recente » Cod sursa (job #2174780) | Cod sursa (job #1416972) | Cod sursa (job #2760912) | Cod sursa (job #2587811) | Cod sursa (job #2307196)
#include <iostream>
#include <fstream>
using namespace std;
const int NMAX = 100000;
long long int v[NMAX + 1];
long long int vis[10 * NMAX + 1];
long long int n;
long long int x[NMAX];
long long int euler[NMAX + 1];
long long int answer;
long long int prime[NMAX + 1], primeSize;
void generateEuler() {
// euler[i] = -1 => are divizori primi cu exponent > 1
// euler[i] = v > 0 => nr de divizori primi ai lui i este v
for (int i = 2; i <= NMAX; ++i) {
if (euler[i] == 0) {
for (int j = i; j <= NMAX; j = j + i) {
if ( (j / i ) % i == 0 ) {
euler[j] = -1;
} else if (euler[j] != -1) {
euler[j] ++;
}
}
}
if (euler[i] != -1) {
if (euler[i] % 2 == 0 ) {
answer = answer - (x[i] * (x[i] - 1) / 2);
} else {
answer = answer + (x[i] * (x[i] - 1) / 2);
}
}
}
}
int main() {
ifstream f("pairs.in");
ofstream g("pairs.out");
int nr;
f >> nr;
n = 0;
// elimin dublurile
for (int i = 0; i < nr; ++i) {
int x;
f >> x;
if (vis[x] == 0) {
v[n] = x;
n ++;
vis[x] = 1;
}
}
for (int i = 2; i <= NMAX / 2; ++i) {
for (int j = i; j <= NMAX; j += i) {
if (vis[j] != 0) {
x[i] ++;
}
}
}
generateEuler();
g << n * (n - 1) / 2 - answer;
return 0;
}