Cod sursa(job #2735347)

Utilizator vansJos da pa perete vans Data 2 aprilie 2021 11:57:50
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream fin ("pairs.in");
ofstream fout ("pairs.out");

const int maxM = 1e6;

int fr[maxM], vizitat[maxM], nrdivp[maxM];

int main()
{
    int maxim = 0;

    long long n; fin >> n;
    for(int i = 1; i <= n; ++i) {
        int x; fin >> x;
        maxim = max(x, maxim);
        fr[x] += 1;
    }

    long long ans = (n-1) * n / 2; // nr total de perechi
    for(int i = 2; i <= maxim; ++i)
        if(vizitat[i] == 0) { // nu este o combinatie de forma a^n * b^m...
            long long ok = 0, cnt = 0;
            if(nrdivp[i] == 0) // este numar prim
                ok = 1;
            for(int j = i; j <= maxim; j += i) {
                if(ok == 1) {
                    nrdivp[j]++; // din cati factori primi este format j
                    if(j % (i*i) == 0)
                        vizitat[j] = 1;// este o combinatie de forma i^2 * ceva, deci nu ne intereseaza pe viitor
                }
                cnt += fr[j]; // cate numere mai mari decat i sunt in M;
            }
            if(nrdivp[i] % 2 == 1)
                ans -= (cnt-1) * cnt / 2;
            else
                ans += (cnt-1) * cnt / 2;
        }

    fout << ans;
    return 0;
}