Cod sursa(job #2095628)
Utilizator | Data | 27 decembrie 2017 20:15:54 | |
---|---|---|---|
Problema | Pairs | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.49 kb |
#include<cstdio>
using namespace std;
bool f[1000001];
int x[1000001];
int main()
{
freopen("pairs.in","r",stdin);
freopen("pairs.out","w",stdout);
int n,i,y,maxim=0,j;
scanf("%d",&n);
for(i=1;i<=n;++i)
{
scanf("%d",&y);
f[y]=1;
if(maxim<y)
maxim=y;
}
for(i=2;i<=maxim;++i)
{
for(j=1;j<=maxim/i;++j)
{
if(f[i*j])
x[i]++;
}
}
long long sol=0;
for(i=2;i<=maxim;++i)
{
bool ok=1;
int u=i,nr=0;
if(u%2==0)
{
nr++;
if(u%4==0)
ok=0;
else
u/=2;
}
if(ok)
{
int j=3;
while(j*j<=u)
{
if(u%j==0)
{
if(u%(j*j)==0)
{
ok=0;
break;
}
else
{
u/=j;
nr++;
}
}
j+=2;
}
if(ok)
{
if(u>1)
nr++;
if(nr%2)
sol+=((1LL*x[i]*(x[i]-1))/2);
else
sol-=((1LL*x[i]*(x[i]-1))/2);
}
}
}
printf("%lld\n",((1LL*n*(n-1))/2)-sol);
return 0;
}