Pagini recente » Cod sursa (job #387382) | Cod sursa (job #250456) | Cod sursa (job #342763) | Cod sursa (job #3264658) | Cod sursa (job #1704277)
#include <iostream>
#include <fstream>
using namespace std ;
ifstream fin("pairs.in") ;
ofstream fout("pairs.out") ;
int mobius(int x){
if(x == 1){
return 1 ;
}
int rez = 0 ;
for(int i = 2 ; i * i <= x ; i ++){
if(!(x % i)){
rez ++ ;
x = x / i ;
if(!(x % i)){
return 0 ;
}
}
}
if(x != 1){
rez ++ ;
}
if(rez % 2){
rez = -1 ;
}
else{
rez = 1 ;
}
return rez ;
}
int ap[1000000 + 10] , divi[1000000 + 10] ;
int main(){
int max = 0 ;
int n , x ;
fin >> n ;
for(int i = 1 ; i <= n ; i ++){
fin >> x ;
ap[x] ++ ;
if(max < x){
max = x ;
}
}
for(int d = 1 ; d <= max ; d ++){
for(int j = d ; j <= max ; j +=d){
divi[d] += ap[j] ;
}
}
long long rez = 0 ;
for(int d = 1 ; d <= max ; d ++){
int mob = mobius(d) ;
if(mob && divi[d] >= 2){
rez += 1LL * mob * ((1LL * divi[d] * (divi[d] - 1)) / 2) ;
}
}
fout << rez ;
fout.close() ;
fin.close() ;
return 0 ;
}