Pagini recente » Profil Cata123 | Cod sursa (job #320416) | Cod sursa (job #1627976) | Cod sursa (job #461152) | Cod sursa (job #124485)
Cod sursa(job #124485)
#include <stdio.h>
#include <stdlib.h>
long n,i,j,k,q,a[1000002],x,nr;
long v[1000002],prim[200],xmax,ok,list[25];
long long p;
int comp(const void * n1,const void * n2){
return *((long*)n1)-*((long*)n2);
}
int main(){
freopen("pairs.in","r",stdin);
freopen("pairs.out","w",stdout);
scanf ("%ld",&n);
p=(long long)n*(n-1)/2;
for (i=1;i<=n;i++){
scanf ("%ld",&x);
if (x>xmax)xmax=x;
a[x]++;
}
for (i=1;i<=xmax;i++)
for (j=1;j<=xmax/i;j++)
v[i]+=a[i*j];
//nr prime
i=5;
q=2;
prim[1]=2;
prim[2]=3;
while (i<1200){
ok=1;
j=1;
while (prim[j]*prim[j]<=i){
if (i%prim[j]==0){ok=0;break;}
j++;
}
if (ok){q++;prim[q]=i;}
i+=2;
}
for (i=2;i<=xmax;i++){
k=0;nr=i;
while (nr!=1){
ok=0;
for (j=1;prim[j]*prim[j]<=nr;j++)
if (nr%prim[j]==0){nr/=prim[j];ok=1;k++;list[k]=prim[j];}
if (!ok&&nr>1){k++;list[k]=nr;nr=1;}
}
qsort(list,k+1,sizeof(long),comp);
ok=1;
for (j=1;j<k;j++)if (list[j]==list[j+1]){ok=0;break;}
if (ok)
if (k%2==1)p-=(long long)v[i]*(v[i]-1)/2;
else p+=(long long)v[i]*(v[i]-1)/2;
}
printf("%ld\n",p);
return 0;
}