Pagini recente » Cod sursa (job #1607282) | Cod sursa (job #2630668) | Cod sursa (job #249858) | Cod sursa (job #421795) | Cod sursa (job #549346)
Cod sursa(job #549346)
#include<stdio.h>
#include <math.h>
#define Nmax 1000001
#define L long long
int max,nr,i,j,n,m,a[Nmax],prim[1000];
bool ok[10000],put[200];
L rez;
void ciur()
{
int i,j;
prim[nr=1]=2;
for (i=3;i<=(int)sqrt(Nmax);i+=2)
if (!ok[i])
{
prim[++nr]=i;
for (j=i*i;j<=sqrt(Nmax);j+=(2*i))
ok[j]=true;
}
}
void back(int k,int p)
{
int i;
if (p!=1)
{
L q=0;
for (i=1;i<=n;i++)
if (a[i]%p==0) q++;
q=(L)q*(q-1)/2;
if (k%2==1) rez-=q;
else rez+=q;
}
for (i=1;i<=nr;i++)
if (!put[i])
{
put[i]=true;
if ((L)p*prim[i]<max) back(k,p*prim[i]);
put[i]=false;
}
}
int main()
{
freopen("pairs.in","r",stdin);
freopen("pairs.out","w",stdout);
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if (a[i]>max) max=a[i];
}
rez=(L)n*(n-1)/2;
ciur();
back(1,1);
printf("%d\n",rez);
return 0;
}