Pagini recente » Cod sursa (job #1405716) | Cod sursa (job #2581236) | Cod sursa (job #2405218) | Cod sursa (job #1754127) | Cod sursa (job #549437)
Cod sursa(job #549437)
#include<stdio.h>
#define Nmax 1000009
#define L long long
int sol[1000],max,nr,i,j,n,m,prim[1000],c[Nmax];
bool ok[Nmax],a[Nmax];
L rez;
void ciur()
{
int i,j;
prim[nr=1]=2;
for (i=3;i<=max;i+=2)
if (!ok[i])
{
prim[++nr]=i;
for (j=i*i;j<=max;j+=(2*i))
ok[j]=true;
}
}
void back(int k,int p)
{
int i;
if (p!=1&&p<=max)
if (k%2==0) rez-=((L)c[p]*(c[p]-1)/2);
else rez+=((L)c[p]*(c[p]-1)/2);
for (i=sol[k-1]+1;i<=nr;i++)
{
sol[k]=i;
if ((L)p*prim[i]<=max) back(k+1,p*prim[i]);
}
}
int main()
{
freopen("pairs.in","r",stdin);
freopen("pairs.out","w",stdout);
scanf("%d",&n);
rez=(L)n*(n-1)/2;
for (i=1;i<=n;i++)
{
scanf("%d",&j);
a[j]=true;
if (j>max) max=j;
if (j==1) rez=rez-n+1;
}
ciur();
for (j=1;j<=max;j++)
for (i=j;i<=max;i+=j)
if (a[i]) c[j]++;
back(1,1);
printf("%lld\n",rez);
return 0;
}