Cod sursa(job #2502791)

Utilizator FrostfireMagirescu Tudor Frostfire Data 1 decembrie 2019 16:42:25
Problema Pairs Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 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+100];
short int a[VALMAX+100];
int sol, n;
bool ciur[VALMAX+100], b[VALMAX+100], parity[VALMAX+100];
vector <int> prime[VALMAX+100];

void ciurul()
{   ciur[0] = ciur[1] = 1;
    for(int i=2; i<=VALMAX; i++)
        if(!ciur[i])
            {   for(int j=i; j<=VALMAX; j+=i)
                    {   ciur[j] = 1;
                        parity[j] = 1 - parity[j];
                        if(b[j]) prime[j].push_back(i);
                    }
            }
}

void pinex(int x)
{   int m = prime[x].size();
    for(int mask=1; mask<(1<<m); mask++)
        {   int p = 1;
            for(int i=0; i<m; i++) if(mask & (1 << i)) p = p * prime[x][i];
            a[p]++;
        }
}

int main()
{
    f >> n;
    for(int i=1; i<=n; i++)
        {   f >> v[i];
            b[v[i]] = 1;
        }
    ciurul();
    for(int i=1; i<=n; i++) pinex(v[i]);
    for(int i=2; i<=VALMAX; i++)
        {   if(parity[i]) 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;
}