Pagini recente » Cod sursa (job #2182836) | Cod sursa (job #1265972) | Cod sursa (job #2666223) | Cod sursa (job #849431) | Cod sursa (job #130037)
Cod sursa(job #130037)
#include<cstdio>
#include<cmath>
long long sol,rez;
int p[80000],x[1000001];
char a[1000001],e[1000001];
int n,X,i,j,k,nr,m,max;
void calcul(){
for(i=2;i<=max;++i){
k=max/i;
for(j=1;j<=k;++j)
if(a[i*j]) ++x[i];
}
}
void prim(){
k=sqrt((double)max);
for(i=2;i<=k;++i){
j=i*i;
while(j<=max){
e[j]=1;j=j+i;
}
}
for(i=2;i<=max;++i)
if(!e[i])
p[++m]=i;
}
void rezolvare(){
sol=(long long)n*(n-1)/2;
rez=0;
for(i=2;i<=max;++i){
if(x[i]<=1) continue;
X=i;
nr=0;
for(j=1;p[j]<=sqrt((double)X);++j)
if(X%p[j]==0){
nr++;
X=X/p[j];
if(X%p[j]==0){
nr=-1;break;
}
}
if(nr==-1)
continue;
nr++;
if(nr%2)
rez+=(long long)x[i]*(x[i]-1)/2;
else
rez-=(long long)x[i]*(x[i]-1)/2;
}
sol=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",&X);
a[X]=1;
if(X>max) max=X;}
calcul();
prim();
rezolvare();
printf("%lld\n",sol);
fclose(stdin);
fclose(stdout);
return 0;
}