Pagini recente » Cod sursa (job #2149468) | Cod sursa (job #2894380) | Cod sursa (job #1222848) | Cod sursa (job #1942908) | Cod sursa (job #109330)
Cod sursa(job #109330)
#include <stdio.h>
#include <algorithm>
using namespace std;
#define NMAX 100020
long int a[NMAX],h[NMAX*10],pr[NMAX],k,n,m,v[NMAX];
char ax[NMAX*10];
long long i,j,sol,sol2;
void ciur()
{
for (i=2;i<=m;i++)
ax[i]=1;
for (i=2;i<=m;i++)
if (ax[i])
{
pr[ ++pr[0] ]=i;
for (j=i*i;j<=m;j+=i)
ax[j]=0;
}
}
void back(long int nivel, long int nr1, long int nr)
{
if (nivel==k+1)
{
if (nr1==0) return;
if (nr1%2==0) sol2-=h[nr];
else sol2+=h[nr];
h[nr]++;
return;
}
back(nivel+1,nr1,nr);
back(nivel+1,nr1+1,nr*v[nivel]);
}
int main()
{
freopen("pairs.in","r",stdin);
freopen("pairs.out","w",stdout);
scanf("%ld",&n);
for (i=1;i<=n;i++)
scanf("%ld",&a[i]);
m=2000;
sort(a+1,a+n+1);
ciur();
for (i=1;i<=n;i++)
{
k=a[i];
v[0]=0;
for (j=1;pr[j]*pr[j]<=k;j++)
{
if (k%pr[j]==0)
{
v[ ++v[0] ] = pr[j];
for (;k%pr[j]==0;k/=pr[j]);
}
}
if (k>1) v[++v[0] ] = k;
k=v[0];
sol2=0;
back(1,0,1);
sol+=i-1-sol2;
}
printf("%lld",sol);
return 0;
}