Pagini recente » Cod sursa (job #1488880) | Cod sursa (job #1812376) | Cod sursa (job #1699144) | Cod sursa (job #1834036) | Cod sursa (job #213723)
Cod sursa(job #213723)
#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)
{
//daca i este prim, actualizam nrd
for (j=i; j<N; j+=i)
if(nrd[j]!=-1)
nrd[j]++;
if(i<=1000)
{
k=i*i;
for (j=k; j<N; j+=k)
nrd[j]=-1;
}
}
//actualizam v[i]
for(j=i; j<N; j+=i)
if(nrd[j] && set[j])
v[i]++;
}
}
inline long long comb(int n)
{
long long nn=(long long)n;
return nn*(nn-1)>>1;
}
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;
}