Pagini recente » Cod sursa (job #1041824) | Cod sursa (job #2980396) | Cod sursa (job #2718892) | Cod sursa (job #2236429) | Cod sursa (job #629910)
Cod sursa(job #629910)
#include <fstream>
#include <vector>
using namespace std;
ifstream fi ("pairs.in");
ofstream fo ("pairs.out");
const int DIM = 1000010;
char ap[DIM];
int D[DIM], prim[DIM], valmax, N, P, K, X[10];
long long S;
void cit ()
{
fi >> N;
for (int i = 1, x; i <= N; i++)
{
fi >> x;
if (ap[x] == 1)
{
i--, N--;
continue;
}
ap[x] = 1;
valmax = max (valmax, x);
}
}
void comb (int k)
{
if (k - 1 == K)
{
if (K & 1)
S += D[P] * (D[P]-1) / 2;
else
S -= D[P] * (D[P]-1) / 2;
return;
}
for (int i = X[k-1]+1; i <= prim[0] && P*prim[i] <= valmax; i++)
{
X[k] = i;
P *= prim[i];
comb (k + 1);
P /= prim[i];
}
}
void ciur ()
{
int i, j;
for (i = 2; i <= valmax; i++)
{
if (prim[i] == 0)
{
prim[++prim[0]] = i;
for (j = i+i; j <= valmax; j += i)
prim[j] = 1;
}
for (j = i; j <= valmax; j += i)
D[i] += ap[j];
}
for (K = 1; K <= 8; K++)
{
P = 1;
comb (1);
}
}
void afi ()
{
fo << (long long) N * (N - 1) / 2 - S;
}
int main ()
{
cit ();
ciur ();
afi ();
return 0;
}