Cod sursa(job #3218724)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 27 martie 2024 22:11:51
Problema Pairs Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 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 int long long

const int NMAX=1e6+5;

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

int freq[NMAX];
int v[NMAX];
int saiz;

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

signed main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(NULL);
    fout.tie(NULL);

    int n,i,j;
    long long ans=0;
    map<int,int>mp;
    fin>>n;
    for(i=1;i<=n;i++)
    {
        int x;
        fin>>x;
        mp[x]++;
        saiz=max(saiz,x);
    }
    precompute_mobius();
    for(i=1;i<=saiz;i++)
    {
        int kon=0;
        for(j=i;j<=saiz;j+=i)
            kon+=mp[j];
        ans+=mobius[i]*kon*(kon-1)/2;
    }
    fout<<ans;
    fin.close();
    fout.close();
    return 0;
}