Cod sursa(job #3271131)

Utilizator andrei.nNemtisor Andrei andrei.n Data 25 ianuarie 2025 10:55:57
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>
#define int long long
#define MOD 666013

using namespace std;

bitset<1005> notprime;
int prime[200],cntprime;
short mobius[1000005];
int fr[1000005];

void ciur()
{
    for(int i=2; i<1005; ++i)
        if(!notprime[i])
        {
            prime[cntprime++] = i;
            for(int j=i*i; j<1005; j+=i)
                notprime[j] = 1;
        }
    for(int i=1; i<1000005; ++i) mobius[i] = -2;
    for(int i=2; i<1000005; ++i)
        if(mobius[i] == -2)
        {
            mobius[i] = 1;
            for(int j=i+i; j<1000005; j+=i)
                if(j/i%i == 0)
                    mobius[j] = 0;
                else
                    mobius[j] = min(-mobius[j], 1);
        }
}

signed main()
{
    ifstream fin ("pairs.in");
    ofstream fout ("pairs.out");
//    #define fin  cin
//    #define fout cout
    int n; fin>>n;
    ciur();
    int cn=n;
    while(cn--)
    {
        int x; fin>>x;
        ++fr[x];
    }
    int res=0;
    for(int i=2; i<1000005; ++i)
    {
//        cout<<i<<' '<<mobius[i]<<'\n';
        if(mobius[i] == 0) continue;
        int cnt=0;
        for(int j=i; j<1000005; j+=i)
            cnt += fr[j];
        res += cnt*(cnt-1)/2 * mobius[i];
    }
    fout<<n*(n-1)/2 - res;
    return 0;
}