Cod sursa(job #2946780)

Utilizator MerlinTheWizardMelvin Abibula MerlinTheWizard Data 25 noiembrie 2022 03:55:07
Problema Pairs Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<iostream>
#include<fstream>
#define NMAX 1000005 
using namespace std;

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

int n;
int maxVal;
bool frev[NMAX],divizibleSquared[NMAX],ciur[NMAX],ifDivSq[NMAX];
int number[NMAX];

void citire()
{
    f>>n;
    int x;
    for(int i=1;i<=n;i++)
    {
        f>>x;
        frev[x] = true;
        maxVal = max(x,maxVal);
    }
}

void makeCiur()
{
    for(int i=2;i<=maxVal/2;i++)
    {
        if(ciur[i] == false)
        {
            number[i]++;
            for(int j = i*2;j <= maxVal; j = j + i)
            {
                number[j]++;
                ciur[j] = true;
                if(j%(i*i) == 0)
                    ifDivSq[j] = true;
            }
        }
    }
}

void findAnswer()
{
    long long ans = n*(n-1)/2;
    int cnt = 0;
    for(int i=2;i<=maxVal;i++)
    {
        if(ifDivSq[i] == false)
        {
            cnt = 0;
            for(int j=i;j<=maxVal;j = j + i)
            {
                if(frev[j] == true)
                {
                    cnt++;
                }
            }
            if(number[i] % 2 == 1)
                ans = ans - (cnt * (cnt-1)/2);
            else
                ans = ans + (cnt * (cnt-1)/2);
        }
    }
    g<<ans;
}

void solve()
{
    makeCiur();
    findAnswer();
}

int main()
{
    citire();
    solve();
}