Pagini recente » Rezultatele filtrării | Cod sursa (job #911762) | Cod sursa (job #3158154) | Cod sursa (job #2749090) | Cod sursa (job #2307266)
#include <iostream>
#include <fstream>
#define NMAX 1000010
using namespace std;
int vis[NMAX + 1];
long long int n;
int x[NMAX + 1];
int euler[NMAX + 1];
long long int answer;
int vmax;
int nusepoate[NMAX];
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 <= vmax; ++i) {
if (euler[i] == 0) {
for (int j = i; j <= vmax; j = j + i) {
euler[j] ++;
if (j % (i * i) == 0) {
nusepoate[j] = 1;
}
}
}
}
for (int i = 2; i <= vmax; ++i) {
if (nusepoate[i] == 0) {
// long long int currentSum = 0;
// for (int j = i; j <= vmax; j += i) {
// currentSum = currentSum + vis[j];
// }
// if (euler[i] % 2 == 0) {
// answer = answer - currentSum;
// } else {
// answer = answer + currentSum;
// }
if (euler[i] % 2 == 1) {
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");
f >> n;
for (int i = 0; i < n; ++i) {
int x;
f >> x;
vis[x] = 1;
vmax = max(vmax, x);
}
for (int i = 2; i <= vmax; ++i) {
for (int j = i; j <= vmax; j += i) {
if (vis[j] != 0) {
x[i] ++;
}
}
}
generateEuler();
g << n * (n - 1) / 2 - answer;
return 0;
}