Pagini recente » Cod sursa (job #434215) | Cod sursa (job #2549593) | Cod sursa (job #1413862) | Cod sursa (job #1101694) | Cod sursa (job #1021371)
#include<fstream>
using namespace std;
#define max_n 1000100
ifstream f("pairs.in");
ofstream g("pairs.out");
int n , x , max_v , k , k1 , nr , ok , prod;
bool Fr[max_n] , V[max_n];
int Prim[100000] , Nr[max_n];
void read(){
f>>n;
for( int i = 1 ; i <= n ; i++ ){
f>>x; Fr[x] = 1;
max_v = x > max_v ? x : max_v;
}
}
int desc( int i , int& prod ){
int nr = 0;
prod = 1;
for( int j = 0 ; j < k ; j++ ){
if( i & (1<<j) ){
nr++;
prod *= Prim[j+1];
}
}
return nr%2;
}
int main(){
read();
int i , j;
for( i = 2 ; i <= max_v ; i++ ){
if( V[i] == 0 ){
Prim[++k] = i;
for( j = i ; j <= max_v ; j += i ){
V[j] = 1;
if( Fr[j] )
Nr[i]++;
}
}
else{
nr = i; ok = 1; k1 = 1;
while( Prim[k1]*Prim[k1] <= i ){
if( nr % Prim[k1] == 0 ){
nr /= Prim[k1];
if( nr % Prim[k1] == 0 ){
ok = 0;
break;
}
}
k1++;
}
for( j = i ; ok && j <= max_v ; j += i )
if( Fr[j] )
Nr[i]++;
}
}
long long total = (n-1)*n/2;
for( i = 1 ; i < (1<<k) ; i++ ){
ok = desc(i , prod);
if( prod > max_v )
continue;
if( ok ){
total -= (Nr[prod] * (Nr[prod] - 1) / 2);
}
else{
total += (Nr[prod] * (Nr[prod] - 1) / 2);
}
}
g<<total;
return 0;
}