Cod sursa(job #3287764)

Utilizator solicasolica solica solica Data 19 martie 2025 10:09:12
Problema Pairs Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.39 kb
/*
  ____   ___  _     ___ ____    _
 / ___| / _ \| |   |_ _/ ___|  / \
 \___ \| | | | |    | | |     / _ \
  ___) | |_| | |___ | | |___ / ___ \
 |____/ \___/|_____|___\____/_/   \_\

*/
#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define pii pair<int,int>

const int NMAX = 1e5+9;

const int MMAX = 1e6+9;

const int MOD = 1e9+7;

int binpow(int n, int k)
{
    if (k==0)
    {
        return 1;
    }
    int x=binpow(n,k/2)%MOD;
    if (k%2==0)
    {
        return x*x%MOD;
    }
    else
    {
        return x*x%MOD*n%MOD;
    }
}

int n,v[NMAX],i,j;

int nrdiv[MMAX];

int fr[MMAX];

vector<int>primes;

bitset<MMAX>ciur;

ifstream fin ("pairs.in");
ofstream fout ("pairs.out");

#define cin fin
#define cout fout

void run_case ()
{
    cin>>n;
    for (i=1; i<=n; i++)
    {
        cin>>v[i];
        fr[v[i]]++;
    }
    for (i=2; i<MMAX; i++)
    {
        if (ciur[i]==0)
        {
            primes.pb (i);
            for (j=i*2; j<MMAX; j+=i)
            {
                ciur[j]=1;
            }
        }
        for (j=i; j<MMAX; j+=i)
        {
            nrdiv[i]+=fr[j];
        }
    }
    sort (v+1,v+n+1);
    int answer=0;
    for (i=1; i<=n; i++)
    {
        vector<int>divs;
        int contor=0,a=v[i];
        while (a>1)
        {
            int p=0;
            while (a%primes[contor]==0)
            {
                ++p;
                a/=primes[contor];
            }
            if (p)
            {
                divs.pb (primes[contor]);
            }
            contor++;
            if (primes[contor]*primes[contor]>a && a>1)
            {
                break;
            }
        }
        if (a>1)
        {
            divs.pb (a);
        }
        int cntr=divs.size();
        int cans=0;
        for (int mask=1; mask<(1<<cntr); mask++)
        {
            int cnr=1;
            for (int j=0; j<cntr; j++)
            {
                if ((1<<j)&mask)
                {
                    cnr*=divs[j];
                }
            }
            if (__builtin_popcount (mask)%2==0)
            {
                cans-=nrdiv[cnr];
            }
            else
            {
                cans+=nrdiv[cnr];
            }
        }
        answer+=(n-cans);
    }
    cout<<answer/2;
}

signed main ()
{
    ios_base::sync_with_stdio(0);
    cin.tie(NULL),cout.tie (NULL);
    int teste;
    teste=1;
    while (teste--)
    {
        run_case();
    }
}