Pagini recente » Cod sursa (job #2652389) | Cod sursa (job #108830) | Cod sursa (job #859351) | Cod sursa (job #2343228) | Cod sursa (job #150995)
Cod sursa(job #150995)
using namespace std;
#include <cstdio>
int V[1<<17];
int N;
int Ct[1000001];
int NP[8];
int Nr, Np;
int P[80000];
char E[1000001];
void read ()
{
scanf ("%d\n", &N);
int i, j, tmp, pow, k;
for (i = 2; i <= 1000; ++ i)
if (E[i] != 1)
{
P[++ Np] = i;
for (j = i + i; j <= 1000000; j += i)
E[j] = 1;
}
for (i = 1001; i <= 1000000; ++ i)
if (E[i] != 1)
P[++ Np] = i;
//printf ("%d\n", Np);
for (i = 1; i <= N; ++ i)
{
scanf ("%d\n", V + i);
tmp = V[i];
Nr = 0;
for (j = 1; E[tmp] != 0; ++ j)
if (!(tmp % P[j]))
{
NP[++ Nr] = P[j];
while (!(tmp % P[j]))
tmp /= P[j];
}
if (tmp != 1)
NP[++ Nr] = tmp;
/*for (j = 1; j <= Nr; ++ j)
printf ("%d ", NP[j]);
printf ("\n");*/
pow = (1 << Nr);
for (j = 1; j < pow; ++ j)
{
tmp = 1;
for (k = 0; k < Nr; ++ k)
if (j & (1 << k))
tmp *= (NP[k + 1]);
++ Ct[tmp];
}
}
/*for (i = 1; i <= 20; ++ i)
printf ("%d ", Ct[i]);*/
}
void solve ()
{
int i, tmp, j, k, pow, cnt, sol;
long long Ans = 0;
for (i = 1; i <= N; ++ i)
{
sol = Nr = 0;
tmp = V[i];
for (j = 1; E[tmp] != 0; ++ j)
if (!(tmp % P[j]))
{
NP[++ Nr] = P[j];
while (!(tmp % P[j]))
tmp /= P[j];
}
if (tmp != 1)
NP[++ Nr] = tmp;
pow = (1 << Nr);
for (j = 1; j < pow; ++ j)
{
tmp = 1;
cnt = 0;
for (k = 0; k < Nr; ++ k)
if (j & (1 << k))
{
tmp *= (NP[k + 1]);
++ cnt;
}
if (cnt & 1)
sol += Ct[tmp];
else
sol -= Ct[tmp];
}
//printf ("%d\n", sol);
Ans = (long long)(Ans + N - sol);
}
Ans = (long long) (Ans / 2);
printf ("%lld\n", Ans);
}
int
main ()
{
freopen ("pairs.in", "rt", stdin);
freopen ("pairs.out", "wt", stdout);
read ();
solve ();
return 0;
}