Pagini recente » Cod sursa (job #1807508) | Cod sursa (job #2463403) | Cod sursa (job #3121593) | Cod sursa (job #1420921) | Cod sursa (job #229655)
Cod sursa(job #229655)
#include <stdio.h>
#define NMAX 1000001
int N, x[NMAX]={0}, Max;
long long sol, aux;
char P[NMAX]={0}, D[NMAX]={0}, R[NMAX]={0};
/*x[i]=nr de el ale multimii ce se divid prin i
P[i]=0 daca i este prim,1 altfel
D[i]=0 daca i are un numar par de divizori primi,1 altfel
R[i]=0 daca fiecare factor prim din desc lui i apare la puterea 1,1 altfel*/
int max(int A,int B)
{
return A>B?A:B;
}
int main()
{
int i,j;
freopen("pairs.in", "r", stdin);
freopen("pairs.out", "w", stdout);
scanf("%d\n", &N);
for (i=1, Max=0; i<=N; ++i)
{
scanf("%d", &j);
x[j]=1;
Max=max(Max,j);
}
sol=(long long)N*(N-1)/2;
for (i=2; i<=Max; ++i)
{
for (j=2; j<=(Max/i); ++j) x[i]+=x[i*j];
if (!P[i])
for (j=2, D[i]=1; j<=(Max/i); ++j)
{
P[j*i]=1;
D[j*i]=1-D[j*i];
if (j%i==0) R[j*i]=1;
}
if (R[i]) continue;
aux=(long long)x[i]*(x[i]-1)/2;
if (!D[i]) sol+=aux;
else sol-=aux;
}
printf("%lld\n", sol);
return 0;
}