Pagini recente » Cod sursa (job #2383866) | Cod sursa (job #592535) | Cod sursa (job #395315) | Cod sursa (job #81735) | Cod sursa (job #1419651)
#include <cstdio>
#include <algorithm>
#define ValMax 1000005
using namespace std;
bool fr[ValMax];
int cnt[ValMax],ciur[ValMax],a[100005],len[100005];
int v[100005][9];
inline void Desc(int lin, int x)
{
int d=3,k=0;
len[lin]=0;
while(x%2==0)
{
++k;
x/=2;
}
if(k) v[lin][++len[lin]]=2;
while(x>1 && d*d<=x)
{
k=0;
while(x%d==0)
{
++k;
x/=d;
}
if(k) v[lin][++len[lin]]=d;
d+=2;
}
if(x>1) v[lin][++len[lin]]=x;
}
int main()
{
int n,i,j,x,nr,produs,stare,Maxim=0;
long long sol=0;
freopen ("pairs.in","r",stdin);
freopen ("pairs.out","w",stdout);
scanf("%d", &n);
for(i=1;i<=n;++i)
{
scanf("%d", &a[i]);
Maxim=max(Maxim,a[i]);
Desc(i,a[i]);
for(stare=1;stare<(1<<len[i]);++stare)
{
produs=1;
for(j=0;j<len[i];++j)
if((1<<j)&stare)
produs=produs*v[i][j+1];
++cnt[produs];
}
}
cnt[1]=n;
for(i=2;i<=Maxim;++i)
if(!ciur[i])
{
sol+=1LL*cnt[i]*(cnt[i]-1)/2;
for(j=i*2;j<=Maxim;j+=i) ++ciur[j];
}
else
{
sol-=1LL*cnt[i]*(cnt[i]-1)/2*(ciur[i]-1);
for(j=i*2;j<=Maxim;j+=i) ciur[j]-=ciur[i]-1;
}
printf("%lld\n", 1LL*n*(n-1)/2-sol);
return 0;
}