Cod sursa(job #3146716)

Utilizator lensuLensu Alexandru lensu Data 22 august 2023 12:22:56
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>
#include <vector>
#define int long long

using namespace std;

ifstream cin("pairs.in");
ofstream cout("pairs.out");

const int NMAX = 1e6;


vector<int> prime;
bool eprim[NMAX+1];
int N, F[NMAX+1], f[NMAX+1], ans, cate;


void eratostene()
{
    for(int i = 3; i <= NMAX; i+= 2)
    {
        if(eprim[i] == 0)
            for(int j = i + i; j <= NMAX; j += i)
                eprim[j] = 1;
    }

    prime.push_back(2);
    for(int i = 3; i <= NMAX; i++)
    {
        if(eprim[i] == 0 && i % 2)
            prime.push_back(i);
    }
}

void rez(vector<int> &sub, int n, vector<int> &elem)
{
    int P = 1;
    for(int i = 1; i <= n; i++)
    {
        P *= elem[sub[i]];
    }
    if(n % 2)
        cate += F[P];
    else cate -= F[P];
    F[P]++;
}

void Back(vector<int> &sub, int k, vector<int> &elem)
{
    for(int i =  sub[k-1] + 1; i < elem.size(); i++)
    {
        sub[k] = i;
        rez(sub,k,elem);
        if(k < elem.size())
        {
            Back(sub, k + 1, elem);
        }
    }
}

void Desc(int B)
{
    vector<int> factoriprimi;
    int ind = 0, d = prime[0];
    while(B != 1)
    {
        if(B % d == 0)
        {
            factoriprimi.push_back(d);
            while(B % d == 0)
                B /= d;
        }
        if(prime[ind+1] * prime[ind+1] > B)
            d = B;
        else d = prime[++ind];
    }

    vector<int> submultimi(factoriprimi.size()+1);
    submultimi[0] = -1;
    Back(submultimi, 1, factoriprimi);
}

signed main()
{
    eratostene();
    cin >> N;
    for(int i = 1; i <= N; i++)
    {
        int x;
        cin >> x;
        int B = x;
        Desc(B);
        ans += i - 1 - cate - f[x];
        cate = 0;
        f[x]++;
    }
    cout << ans;
}