Cod sursa(job #3226884)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 23 aprilie 2024 10:43:15
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>

#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

///#include <tryhardmode>
///#include <GODMODE::ON>

using namespace std;

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

#define cin fin
#define cout fout

const int NMAX=1e6+5;

int mobius[NMAX];
bool ciur[NMAX];
int freq[NMAX];
int lpf[NMAX];

void precompute_mobius()
{
    int i,j;
    lpf[1]=1;
    mobius[1]=1;
    for(i=2;i<=NMAX-3;i++)
    {
        if(!ciur[i])
        {
            for(j=i;j<=NMAX-3;j+=i)
            {
                ciur[j]=true;
                lpf[j]=i;
            }
        }
    }
    for(i=2;i<=NMAX-3;i++)
    {
        if(lpf[i]==lpf[i/lpf[i]])
            mobius[i]=0;
        else
            mobius[i]=-mobius[i/lpf[i]];
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n,i,j;
    long long ans=0;
    cin>>n;
    for(i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        freq[x]++;
    }
    precompute_mobius();
    for(i=1;i<=NMAX-3;i++)
    {
        int kon=0;
        for(j=i;j<=NMAX-3;j+=i)
            kon+=freq[j];
        ans+=1LL*mobius[i]*kon*(kon-1)/2;
    }
    cout<<ans;
    return 0;
}