Pagini recente » Cod sursa (job #2562543) | Profil grosugeorge | Cod sursa (job #968680) | Istoria paginii utilizator/dyazuzik | Cod sursa (job #202155)
Cod sursa(job #202155)
#include <stdio.h>
#define FIN "pairs.in"
#define FOUT "pairs.out"
#define MAX 1000001
int N,max,vec_ap[MAX],nr[MAX];
char prim[MAX];
long long REZ;
int i,j,l,x;
void ciur()
{
for (i=2;i<=max;++i)
prim[i]=1;
for (i=2;i<=max;++i)
{
for (j=i+i;j<=max;j+=i)
if (vec_ap[j]==1)
vec_ap[i]++;
if ((int)prim[i]==1)
{
nr[i]=1;
for (l=i+i;l<=max;l+=i)
{
prim[l]=0;
if (nr[l]==-1) continue;
if ((l/i)%i==0)
nr[l]==-1;
else
nr[l]++;
}
}
}
}
int maxim(int a, int b)
{
if (a>b) return a;
else return b;
}
void read()
{
freopen(FIN,"rt",stdin);
freopen(FOUT,"wt",stdout);
scanf("%d", &N);
max=0;
for (i=1;i<=N;++i)
{
scanf("%d", &x);
max=maxim(max,x);
vec_ap[x]++;
}
}
void solve()
{
read();
ciur();
REZ=N*(N-1)/2;
for (i=2;i<=max;++i)
{
if (nr[i]==-1) continue;
if (nr[i]%2)
REZ-=(long long)(vec_ap[i]*(vec_ap[i]-1)/2);
else
REZ+=(long long)(vec_ap[i]*(vec_ap[i]-1)/2);
}
printf("%lld", REZ);
}
int main()
{
solve();
return 0;
}