Pagini recente » Cod sursa (job #2525137) | Cod sursa (job #1157144) | Cod sursa (job #98878) | Cod sursa (job #2216817) | Cod sursa (job #1704279)
#include <iostream>
#include <fstream>
using namespace std ;
ifstream fin("pairs.in") ;
ofstream fout("pairs.out") ;
int ciur[1000000 + 10] ;
int prime[1000000 + 10] , nr = 1 ;
void umple(int x){
for(int i = 2 ; i * i <= x ; i ++){
if(ciur[i] == 0){
for(int j = i ; j * i <= x ; j ++){
ciur[i * j] = 1 ;
}
}
}
for(int i = 2 ; i <= x ; i ++){
if(ciur[i] == 0){
prime[nr ++] = i ;
}
}
}
int mobius(int x){
if(x == 1){
return 1 ;
}
int rez = 0 ;
for(int i = 1 ; i <= nr && prime[i] * prime[i] <= x ; i ++){
if(!(x % prime[i])){
rez ++ ;
x = x / prime[i] ;
if(!(x % prime[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 ;
}
}
divi[1] = n ;
for(int d = 2 ; d <= max ; d ++){
for(int j = d ; j <= max ; j +=d){
divi[d] += ap[j] ;
}
}
long long rez = 0 ;
umple(max) ;
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 ;
}