Pagini recente » Cod sursa (job #1875217) | Cod sursa (job #1997248) | Cod sursa (job #2104929) | Istoria paginii runda/td/clasament | Cod sursa (job #199508)
Cod sursa(job #199508)
#include <cstdio>
#define IN "pairs.in"
#define OUT "pairs.out"
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<17
#define M_MAX 1<<20
#define SQRT 1<<10
#define LL long long
int max,N;
LL rez;
int nrpr[SQRT],V[N_MAX];
bool pr[SQRT],bo[M_MAX];
void ciur()
{
nrpr[++ nrpr[0] ] = 2;
FOR(i,3,SQRT)
{
if(pr[i])
continue;
nrpr[ ++nrpr[0] ] =i;
for(int j=i*i;j<=SQRT;j+=i)
pr[j] = 1;
}
}
void scan()
{
freopen(IN, "r",stdin);
freopen(OUT, "w",stdout);
scanf("%d", &N);
FOR(i,1,N)
{
scanf("%d", &V[i]);
if(V[i] > max)
max = V[i];
bo[ V[i] ] = 1;
}
}
void solve()
{
FOR(i,2,max)
{
int nr=0,ok=1,aux=i,nrdiv=0;
for(int j=1;j<= nrpr[0] && ok && nrpr[j] * nrpr[j] <= aux;++j)
if(!(aux % nrpr[j]))
{
aux /= nrpr[j];
++nrdiv;
if(!(aux % nrpr[j]))
ok=0;
}
if(!ok)
continue;
if(aux>1)
++nrdiv;
FOR(j,1,max/i)
nr += bo[ i*j ];
if(nrdiv & 1)
rez += (LL) nr * (nr-1) / 2;
else
rez -= (LL) nr * (nr-1) / 2;
}
printf("%lld\n", (LL) (N * (N-1) / 2) - rez);
}
int main()
{
scan();
ciur();
solve();
return 0;
}