Cod sursa(job #116841)
#include <stdio.h>
#include <fstream>
#include <vector>
using namespace std;
#define in "pairs.in"
#define out "pairs.out"
#define dim 100001
int N, M=0;
int A[dim], C[dim*10]; // C[i] - numarul de numere din M care se divid cu i ( i >= 2 )
bool Sel[dim*10], Ok[dim*10];
vector<int> Div;
int main()
{
// numere prime
memset(Ok,0,sizeof(Ok));
for ( int i = 2; i*i <= 1000000; i++ )
{
int j = 2;
while ( i*j <= 1000000 ) Ok[i*j] = 1, j++;
}
int t=0;
for ( int i = 2; i <= 1000000; i++ )
{
C[i] = 0;
if ( Ok[i] == 0 ) Div.push_back(i);
}
//
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d", &N);
for ( int i = 1; i <= N; i++ )
{
scanf("%d", &A[i]);
Sel[A[i]] = 1;
if ( A[i] > M ) M = A[i];
}
for ( int i = 2; i <= M; i++ )
for ( int j = 1; i*j <= M; j++ )
if ( Sel[i*j] ) C[i] += 1;
int Res=0, Q, ok=0, S, T;
for ( int i = 2; i <= M; i++ )
{
Q = i; S = 0; ok = 1;
for ( int j = 0; Div[j]*Div[j] <= i; j++ )
{
if ( Q % ( Div[j] ) )
{
S += 1;
if ( Q % (Div[j]*Div[j]) ) ok = 0;
while ( Q % Div[j] ) Q /= Div[j];
}
}
if ( Q > 1 ) S += 1;
if ( ok == 0 ) continue;
if ( S & 1 == 0 ) Res -= ( C[i]*(C[i]-1) )>>1;
else Res += ( C[i]*(C[i]-1) )>>1;
}
T = (N*(N-1))>>1;
T -= Res;
printf("%d ", T);
}