Pagini recente » Cod sursa (job #3175593) | Cod sursa (job #2624826) | Cod sursa (job #2567087) | Cod sursa (job #3168812) | Cod sursa (job #214779)
Cod sursa(job #214779)
#include<stdio.h>
struct dub{
int i,j;
};
dub p[1000000];
long long n,i,x,j,c,k,max=-1;
int v[1000000],ver[1000000];
int main()
{
freopen("pairs.in","r",stdin);
freopen("pairs.out","w",stdout);
scanf("%lld",&n);
for(i=0;i<n;i++)
{
scanf("%d",&x);
if(max<x)
max=x;
v[x]=1;
}
if(n%2==0)
c=n/2*(n-1);
else
c=(n-1)/2*n;
p[2].j=1;
for(i=2;i<=max;i++)
if(p[i].i==0)
{
p[i].j=1;
for(j=2*i;j<=max;j+=i)
p[j].i=1;
}
for(i=2;i<=max;i++)
if(p[i].i==0)
for(j=2*i;j<=max;j+=i)
{
if(p[j/i].j==-1)
p[j].j=-1;
else
p[j].j=p[j/i].j+1;
if(j==i*i)
p[j].j=-1;
}
for(i=2;i<=max;i++)
{
if(p[i].j!=-1)
{
for(j=i;j<=max;j+=i)
if(v[j]==1)
ver[i]++;
if(p[i].j%2==0)
c=c+ver[i]*(ver[i]-1)/2;
else
c=c-ver[i]*(ver[i]-1)/2;
}
}
printf("%lld",c);
return 0;
}