Cod sursa(job #2883082)

Utilizator Dragono63Stanciu Rares Stefan Dragono63 Data 1 aprilie 2022 10:10:17
Problema Pairs Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <bits/stdc++.h>
#define NUMMAX 1000005

using namespace std;

/*******************************/
// INPUT / OUTPUT

ifstream f("pairs.in");
ofstream g("pairs.out");
/*******************************/
/// GLOBAL DECLARATIONS

int N;
long long ans;
int x, maxNum;
bool ciur[NUMMAX];
int dv[NUMMAX], lastPrime[NUMMAX];
/*******************************/
/// FUNCTIONS

void ReadInput();
void Solution();
void Output();
/*******************************/
///-------------------------------------
inline void ReadInput()
{
    f >> N;

    for (int i = 1 ; i <= N ; ++ i)
    {
        f >> x;
        dv[x] ++;
        maxNum = max(maxNum, x);
    }
}
///-------------------------------------
inline void Ciur()
{
    for (int i = 2 ; 2 * i <= maxNum ; ++ i)
    {
        if (!ciur[i]) lastPrime[i] = i;
        for (int j = 2 * i ; j <= maxNum ; j += i)
        {
            dv[i] += dv[j];
            if (!ciur[i])
            {
                ciur[j] = true;
                lastPrime[j] = i;
            } 
        }
    }
}
///-------------------------------------
inline void Solve()
{
    int num, prevPrime = -1;
    long long numPairs;
    bool ok = true;
    int cnt = 0;
    ans = 1LL * N * (N - 1) / 2;
    for (int i = 2 ; i <= maxNum ; ++ i)
    {
        num = i;
        prevPrime = 0;
        ok = true;
        cnt = 0;
        while (lastPrime[num])
        {
            cnt ++;
            if (lastPrime[num] == prevPrime)
            {
                ok = false;
                break;
            }
            prevPrime = lastPrime[num];
            num /= lastPrime[num];
        }
        
        if (ok)
        {
            numPairs = 1LL * dv[i] * (dv[i] - 1) / 2;
            if (cnt % 2 == 1) ans -= numPairs;
            else ans += numPairs;
        }
    }
}
///-------------------------------------
inline void Solution()
{
    Ciur();
    Solve();
}
///-------------------------------------
inline void Output()
{
    g << ans;
}
///-------------------------------------
int main()
{
    ReadInput();
    Solution();
    Output();
    return 0;
}