Cod sursa(job #2947495)

Utilizator andu2006Alexandru Gheorghies andu2006 Data 26 noiembrie 2022 10:26:33
Problema Pairs Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<bits/stdc++.h>

using namespace std;
const int NMAX=1e6+5,buffsize=1<<13;
long long MOD=666013;
typedef long long ll;
ofstream fout("pairs.out");
FILE* fin;
char buff[buffsize];
int buffpos=buffsize;
int read(){
    if(buffpos==buffsize) fread(buff,1,buffsize,fin),buffpos=0;
    int n=0;
    while(buff[buffpos]<'0' || buff[buffpos]>'9'){
        ++buffpos;
        if(buffpos==buffsize) fread(buff,1,buffsize,fin),buffpos=0;
    }
    while(buff[buffpos]>='0' && buff[buffpos]<='9'){
        n=(n<<1)+(n<<3)+(buff[buffpos]^48);
        ++buffpos;
        if(buffpos==buffsize) fread(buff,1,buffsize,fin),buffpos=0;
    }
    return n;
}
ll mobius[NMAX],fr[NMAX],primes[NMAX],ciur[NMAX],cntp=0;
void precompute(){
    ciur[0]=ciur[1]=1;
    for(ll i=2;i<NMAX;i++) if(!ciur[i]) for(ll j=i*i;j<NMAX;j+=i) ciur[j]=1;
    for(ll i=2;i<NMAX;i++) if(!ciur[i]) primes[cntp++]=i;
    mobius[1]=1;
    for(ll i=1;i<NMAX;i++){
        if(mobius[i]){
            for(ll p=0;p<cntp && i*primes[p]<NMAX;p++)
                mobius[i*primes[p]]=-mobius[i];
        }
    }
}
int main(){
    precompute();
    fin=fopen("pairs.in","r");
    ll n=read(),ans=0;
    for(ll i=0;i<n;i++) ++fr[read()];
    for(ll i=1;i<NMAX;i++){
        ll cnt=0;
        for(ll m=i;m<NMAX;m+=i) cnt+=fr[m];
        ans+=mobius[i]*cnt*(cnt-1)/2;
    }
    fout<<ans;
    return 0;
}