Pagini recente » Cod sursa (job #1186186) | Cod sursa (job #774040) | Cod sursa (job #1548635) | Cod sursa (job #1525153) | Cod sursa (job #213722)
Cod sursa(job #213722)
#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;
for (i=2; i<N; i++)
{
if (nrd[i]==-1)
continue;
if(nrd[i]==0)
{
//daca i este prim, actualizam nrd
for (j=i; j<N; j+=i)
if(nrd[j]!=-1)
nrd[j]++;
if(i<=1000)
for (j=i*i; j<N; j+=i*i)
nrd[j]=-1;
}
//actualizam v[i]
for(j=i; j<N; j+=i)
if(nrd[j]&&set[j]==true)
v[i]++;
}
}
inline long long comb(int n)
{
long long nn=(long long)n;
return nn*(nn-1)/2;
}
int solvez0r()
{
ciur();
long long ss=0;
for (int i=1; i<N; i++)
{
if (nrd[i]!=-1)
{
if (nrd[i]%2)
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=1; i<=n; i++)
{
scanf("%d",&x);
set[x]=true;
}
s=comb(n);
printf("%lld\n",s-solvez0r());
return 0;
}