Pagini recente » Cod sursa (job #685366) | Cod sursa (job #1769881) | Cod sursa (job #1001277) | Cod sursa (job #2226948) | Cod sursa (job #2095615)
#include<cstdio>
#include<cmath>
using namespace std;
bool f[1000001],c[1000001];
int v[700001],nr,prodx[700001],prody[700001],prodnr[700001],x[700001];
void ciur(int n)
{
v[++nr]=2;
for(int i=4;i<=n;i+=2)
{
c[i]=1;
}
int lim=(int)sqrt(n);
for(int i=3;i<=lim;i+=2)
{
if(!c[i])
{
v[++nr]=i;
for(int j=(i*i)+2*i;j<=n;j+=(2*i))
{
c[j]=1;
}
}
}
if(lim%2==0)
lim++;
else
lim+=2;
for(int i=lim;i<=n;i+=2)
{
if(!c[i])
v[++nr]=i;
}
}
int main()
{
freopen("pairs.in","r",stdin);
freopen("pairs.out","w",stdout);
int n,i,y,maxim=0,j;
scanf("%d",&n);
for(i=1;i<=n;++i)
{
scanf("%d",&y);
f[y]=1;
if(maxim<y)
maxim=y;
}
for(i=2;i<=maxim;++i)
{
for(j=1;j<=maxim/i;++j)
{
if(f[i*j])
x[i]++;
}
}
ciur(maxim);
prodx[0]=1;
int ultim=0;
long long sol=0;
for(i=0;i<=ultim;++i)
{
for(j=prody[i]+1;j<=nr;++j)
{
if(prodx[i]<=maxim/v[j])
{
prodx[++ultim]=prodx[i]*v[j];
prody[ultim]=j;
prodnr[ultim]=prodnr[i]+1;
}
}
if(prodnr[i]%2)
sol+=((1LL*x[prodx[i]]*(x[prodx[i]]-1))/2);
else
sol-=((1LL*x[prodx[i]]*(x[prodx[i]]-1))/2);
}
printf("%lld\n",(1LL*n*(n-1))/2-sol);
return 0;
}