Cod sursa(job #2502822)

Utilizator FrostfireMagirescu Tudor Frostfire Data 1 decembrie 2019 17:32:50
Problema Pairs Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>
#include <iostream>
#include <vector>
#define NMAX 100000
#define VALMAX 1000000

using namespace std;

ifstream f("pairs.in");
ofstream g("pairs.out");

int v[NMAX+10];
bool parity[VALMAX+100];
long long sol, a[VALMAX+100], n;
vector <int> prime[NMAX+10];

void findPrimes(int poz)
{   int x = v[poz];
    for(int d=2; d*d<=x && x!=1; d++)
        if(x % d == 0)
            {   prime[poz].push_back(d);
                while(x % d == 0) x /= d;
            }
    if(x != 1) prime[poz].push_back(x);
}

void pinex(int poz)
{   int m = prime[poz].size();
    for(int mask=1; mask<(1<<m); mask++)
        {   long long p = 1, nr = 0, u = 1;
            for(int i=0; i<m; i++) if(mask & (1 << i)) p = p * prime[poz][i], nr++;
            a[p]+=u;
            parity[p] = nr % 2;
        }
}

int main()
{
    f >> n;
    for(int i=1; i<=n; i++)
        {   f >> v[i];
            findPrimes(i);
            pinex(i);
        }
    for(int i=2; i<=VALMAX; i++)
        {   if(parity[i] & 1) sol = sol + a[i] * (a[i]-1) / 2;
            else sol = sol - a[i] * (a[i]-1) / 2;
        }
    g << n * (n-1) / 2 - sol << '\n';
    return 0;
}