Cod sursa(job #2307255)

Utilizator mihaicivMihai Vlad mihaiciv Data 24 decembrie 2018 09:43:13
Problema Pairs Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <iostream>
#include <fstream>
using namespace std;
const int NMAX = 100000;
long long int v[NMAX + 1];
long long int vis[11 * NMAX + 1];
long long int n;
long long int x[NMAX * 11 + 1];
long long int euler[NMAX * 11 + 1];
long long int answer;

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) {
                euler[j] ++;
            }
        }
    }
    for (int i = 2; i * i <= NMAX; ++i) {
        for (int j = i * i; j <= NMAX; j += i * i) {
            euler[j] = 0;
        }
    }
    for (int i = 2; i <= NMAX; ++i) {
        if (euler[i] > 0 ) {
            long long int currentSum = 0;
            for (int j = i; j <= NMAX; j += i) {
                currentSum += vis[j];
            }
            if (euler[i] % 2 == 0) {
                answer = answer - currentSum;
            } else {
                answer = answer + currentSum;
            }
        }
    }

}

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;
    }

    for (int i = 2; i <= NMAX; ++i) {
        for (int j = i; j <= NMAX; j += i) {
            if (vis[j] != 0) {
                x[i] ++;
            }
        }
    }
    generateEuler();
    answer = n * (n - 1) / 2 - answer;
    g << answer;


    return 0;
}