Pagini recente » Cod sursa (job #851517) | Cod sursa (job #1734780) | Cod sursa (job #874433) | Cod sursa (job #935366) | Cod sursa (job #213733)
Cod sursa(job #213733)
#include <stdio.h>
#define N 1000005
#include <vector>
using namespace std;
int nrd[N],v[N];
vector <bool> set(N,false);
void ciur()
{
int i,j,k;
for (i=2; i<N; i++)
{
if (nrd[i]==-1)
continue;
if(nrd[i]==0)
{
if(i<=1000)
{
k=i*i;
for (j=k; j<N; j+=k)
nrd[j]=-1;
}
//daca i este prim, actualizam nrd
for (j=i; j<N; j+=i)
if(nrd[j]!=-1)
nrd[j]++;
}
//actualizam v[i]
for(j=i; j<N; j+=i)
if(set[j])
v[i]++;
}
}
inline long long comb(int n)
{
long long nn=(long long)n;
return nn*(nn-1)>>1;
}
long long solvez0r()
{
ciur();
long long ss=0;
for (int i=1; i<N; i++)
{
if (v[i]>1)
{
if (nrd[i]&1)
ss+=comb(v[i]);
else
ss-=comb(v[i]);
}
}
return ss;
}
int main()
{
freopen("pairs.in","r",stdin);
freopen("pairs.out","w",stdout);
long long s;
int n,x,i;
scanf("%d",&n);
for (i=0; i<n; i++)
{
scanf("%d",&x);
set[x]=true;
}
s=comb(n);
printf("%lld\n",s-solvez0r());
return 0;
}