Cod sursa(job #2832206)

Utilizator puica2018Puica Andrei puica2018 Data 13 ianuarie 2022 10:25:43
Problema Pairs Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <bits/stdc++.h>

using namespace std;

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

/// fr[i] = de cate ori apare i in sir
/// cnt[i] = cate perechi au cmmdc-ul egal cu un multiplu de i
/// rez = cnt[1] + SUM(k=2...1000000,mobius[k]*cnt[k])

const int m=1000000;

int n;
int mobius[m+5];
long long cnt[m+5],ans;
bitset <m+5> ciur,fr;

int main()
{
    fin>>n;
    for(int i=1; i<=n; i++)
    {
        int x;
        fin>>x;
        fr[x]=1;
    }
    for(int i=1; i<=m; i++)
        mobius[i]=1;
    for(int i=2; i<=m; i++)
    {
        if(ciur[i]==0)
        {
            for(int j=i; j<=m; j+=i)
            {
                mobius[j]*=-1;
                if((j/i)%i==0)
                    mobius[j]=0;
                ciur[j]=1;
            }
        }
    }
    for(int i=1; i<=m; i++)
    {
        if(mobius[i]==0)
            continue;
        int sum=0;
        for(int j=i; j<=m; j+=i)
            sum+=fr[j];
        cnt[i]=1LL*sum*(sum-1)/2;
    }
    long long ans=cnt[1];
    for(int i=2; i<=m; i++)
        ans+=mobius[i]*cnt[i];
    fout<<ans<<"\n";
    return 0;
}