Cod sursa(job #2502853)

Utilizator FrostfireMagirescu Tudor Frostfire Data 1 decembrie 2019 18:14:49
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 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 a[VALMAX+100], b[VALMAX+100], n;
long long sol;
bool ciur[VALMAX+100], parity[VALMAX+100];
vector <int> prime[NMAX+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;
                        if(b[j]) prime[b[j]].push_back(i);
                    }
            }
}

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

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