Cod sursa(job #1704306)

Utilizator Debuger33Numarul1 Debuger33 Data 18 mai 2016 16:21:07
Problema Pairs Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#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 ;
}