Cod sursa(job #2306181)

Utilizator LucianTLucian Trepteanu LucianT Data 21 decembrie 2018 18:50:31
Problema Pairs Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <fstream>
using namespace std;

const int maxVal=1e6;
const int maxN=1e5+1;

int n;
int freq[maxVal+1];

int mobius[maxVal+1];
int nrOfPrimes[maxVal+1];

bool squareDiv[maxVal+1];

int main(){
    ifstream cin("pairs.in");
    ofstream cout("pairs.out");

    cin>>n;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        freq[x]++;
    }

    for(int i=2;i<=maxVal;i++)
        if(!nrOfPrimes[i]){
            for(int j=i;j<=maxVal;j+=i){
                nrOfPrimes[j]++;

                if(i*i<=maxVal && j%(i*i)==0){
                    squareDiv[j]=true;
                }
            }
        }

    mobius[1]=1;
    for(int i=2;i<=maxVal;i++){
        if(!squareDiv[i]){
            if(nrOfPrimes[i]%2){
                mobius[i]=1;
            } else {
                mobius[i]=-1;
            }
        } else {
            mobius[i]=0;
        }
    }

    long long sol=0;
    for(int i=1;i<=maxVal;i++)
        if(mobius[i]){
            for(int j=i+i;j<=maxVal;j+=i){
                freq[i]+=freq[j];
            }
            long long cnt=freq[i]*(freq[i]-1)/2;
            sol+=mobius[i]*cnt;
        }

    cout<<sol;

    return 0;
}