Pagini recente » Cod sursa (job #2767456) | Cod sursa (job #2227500) | Cod sursa (job #3180400) | Cod sursa (job #1003567) | Cod sursa (job #130033)
Cod sursa(job #130033)
#include<stdio.h>
#include<math.h>
char a[1000000],e[1000000];
int n,t,y,i,j,k,nr,m,max,p[80000],x[1000000];
long long sol,rez;
void calcul(){ // calculul
for(i=2;i<=max;++i){
k=max/i;
for(j=1;j<=k;++j)
if(a[j*i]!=0)
++x[i];
}
}
void prim(){ //operatia de prime intre ele
k=sqrt(max);
for(i=2;i<=k;++i){
j=i*i;
while(max>=j){
e[j]=1;
j+=i;
}
}
for(i=2;i<=max;++i)
if(!e[i])
p[++m]=i;
}
void rezolv(){ //ecuatia
sol=n*(n-1)/2;
rez=0;
for(i=2;i<=max;++i){
if(x[i]<=1)
continue;
t=i;
nr=0;
y=sqrt(t);
for(j=1;p[j]<=y;++j)
if(t%p[j]==0){
nr++;
t/=p[j];
if(t%p[j]==0){
nr=-1;
break;
}
}
if(nr==-1)
continue;
nr++;
if(nr%2)
rez+=x[i]*(x[i]-1)/2;
else
rez-=x[i]*(x[i]-1)/2;}
sol-=rez;
}
int main(){
freopen("pairs.in","r",stdin);
freopen("pairs.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;++i){
scanf("%d",&t);
a[t]=1;
if(t>max)
max=t;
}
calcul();
prim();
rezolv();
printf("%lld",sol);
fclose(stdin);
fclose(stdout);
return 0;
}