Pagini recente » Cod sursa (job #3267523) | Cod sursa (job #1441703) | Cod sursa (job #234510) | Borderou de evaluare (job #3292912) | Cod sursa (job #161403)
Cod sursa(job #161403)
#include<stdio.h>
#include<fstream.h>
#include<math.h>
#define nmax 100002
#define nrm 1000002
long n,B[nmax],A[nmax],kk,D[100],p[nmax],d[nrm];
char viz[nrm],viz1[nrm],prim[nrm];
void merge_sort(long ls,long ld)
{
int m=(ls+ld)>>1,i,j,k;
if(ls==ld)
return;
merge_sort(ls,m);
merge_sort(m+1,ld);
for(k=ls,i=ls,j=m+1;k<=ld;)
if(j>ld||i<=m&&A[i]<A[j])
B[k++]=A[i++];
else
B[k++]=A[j++];
for(k=ls;k<=ld;k++)
A[k]=B[k];
}
int main()
{long x,i,j,k,pr,nr,sol=0,rad;
freopen("pairs.in","r",stdin);
scanf("%ld",&n);
for(i=1;i<=n;i++)
{scanf("%ld",&A[i]);
viz[A[i]]=1;
}
merge_sort(1,n);
for(i=2;i<=A[n];i++)
{
if(!viz1[i])
{p[++p[0]]=i;
prim[i]=1;
}
for(j=i;j<=A[n];j+=i)
{
if(viz[j])
d[i]+=1;
viz1[j]=1;
}
}
for(i=1;i<=n;i++)
{x=A[i];
memset(D,0,sizeof(D));
for(j=1,rad=sqrt(x);j<=rad;j++)
if(!(x%j))
{
if(prim[j])
D[++D[0]]=j;
if(prim[x/j]&&x/j!=D[D[0]])
D[++D[0]]=x/j;
}
if(prim[x])
D[++D[0]]=x;
for(k=1,nr=0;k< (1<<D[0]);k++)
{
for(j=0,kk=0,pr=1;j<D[0];j++)
if(k&1<<j)
{pr*=D[j+1];kk++;}
d[pr]--;
if(kk%2)
nr+=d[pr];
else
nr-=d[pr];
}
sol+=(n-i-nr);
}
freopen("pairs.out","w",stdout);
printf("%ld",sol);
fclose(stdout);
return 0;
}