Pagini recente » Cod sursa (job #2703010) | Cod sursa (job #1854266) | Cod sursa (job #1949379) | Cod sursa (job #167319) | Cod sursa (job #116855)
Cod sursa(job #116855)
#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 <= 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;
unsigned long long T=0, Res=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;
if ( S % 2 == 0 ) Res -= ( C[i]*(C[i]-1) ) / 2;
else Res += ( C[i]*(C[i]-1) ) / 2;
}
T = (N*(N-1)) / 2;
T -= Res;
printf("%llu", T);
}