Pagini recente » Cod sursa (job #2006701) | Cod sursa (job #1022235) | Cod sursa (job #278760) | Cod sursa (job #1476058) | Cod sursa (job #1704306)
#include <iostream>
#include <fstream>
using namespace std ;
ifstream fin("pairs.in") ;
ofstream fout("pairs.out") ;
int mobius[1000000 + 10] , ciur[1000 + 10] , prime[1000 + 10] , nr = 1 ;
void umple(){
for(int i = 2 ; i * i <= 1000 ; i ++){
if(ciur[i] == 0){
for(int j = i ; j * i <= 1000 ; j ++){
ciur[i * j] = 1 ;
}
}
}
for(int i = 2 ; i <= 1000 ; i ++){
if(ciur[i] == 0){
prime[nr ++] = i ;
}
}
}
void umple1(int x){
mobius[0] = 0 ; mobius[1] = 1 ; mobius[2] = -1 ;
for(int i = 3 ; i <= x ; i ++){
int ok = 1 ;
for(int j = 1 ; j < nr && prime[j] * prime[j] <= i && ok == 1 ; j ++){
if(i % prime[j] == 0){
mobius[i] = - mobius[i / prime[j]] ;
if((i / prime[j]) % prime[j] == 0){
mobius[i] = 0 ;
}
ok = 0 ;
}
}
if(ok){
mobius[i] = -1 ;
}
}
}
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 ;
}
}
divi[1] = n ;
umple() ;
umple1(max) ;
for(int d = 2 ; 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 ++){
if(mobius[d] && divi[d] >= 2){
rez += 1LL * mobius[d] * ((1LL * divi[d] * (divi[d] - 1)) / 2) ;
}
}
fout << rez ;
fout.close() ;
fin.close() ;
return 0 ;
}