Pagini recente » Cod sursa (job #2868621) | Cod sursa (job #2509705) | Cod sursa (job #2853074) | Cod sursa (job #682353) | Cod sursa (job #3224042)
#include <bits/stdc++.h>
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);
cin.tie(0)->sync_with_stdio(false);
cin >> n;
for (i=1; i<=n; i++)
cin >> 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;
}
cout << sol;
return 0;
}