Pagini recente » Cod sursa (job #2238925) | Cod sursa (job #1252789) | Cod sursa (job #403065) | Cod sursa (job #1830250) | Cod sursa (job #116886)
Cod sursa(job #116886)
#include <stdio.h>
#include <fstream>
#include <vector>
#include <iostream>
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 <= 1000001; i++ )
{
int j = 2;
while ( i*j <= 1000001 ) Ok[i*j] = 1, j++;
}
for ( int i = 2; i <= 1000001; i++ )
{
C[i] = Sel[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 Q, ok=0, S, K;
long long T=0, Res=0, F = 0;
for ( int i = 2; i <= M; i++ )
{
Q = i; S = 0; ok = 1;
if ( C[i] <= 1 ) continue;
for ( int j = 0; Div[j]*Div[j] <= Q; j++ )
{
K = 0;
while ( Q % Div[j] == 0 ) Q /= Div[j], K += 1;
if ( K > 1 )
{
ok = 0;
break;
}
else if ( K == 1 ) S += 1;
}
if ( Q > 1 ) S += 1;
if ( ok == 0 ) continue;
F = C[i];
F = F*(C[i]-1);
F /= 2;
if ( S % 2 == 0 ) Res -= F;
else Res += F;
}
T = N;
T = T*(N-1);
T /= 2;
T -= Res;
printf("%lld", T);
return 0;
}