Pagini recente » Cod sursa (job #918637) | Cod sursa (job #245353) | Cod sursa (job #333482) | Cod sursa (job #1879430) | Cod sursa (job #109862)
Cod sursa(job #109862)
#include <cstdio>
#include <cmath>
#define Nmax 100015
#define Pmax 256
#define Vmax 1000015
#define ll long long
int n, ct;
int sir[Nmax];
int prim[Pmax];
int p[8];
ll nr[Vmax];
void citire()
{
int i;
scanf("%d\n", &n);
for (i = 1; i <= n; ++i)
scanf("%d\n", &sir[i]);
}
int pr(int n)
{
int i, rad = (int)(sqrt(n));
for (i = 2; i <= rad; ++i)
if (n % i == 0) return 0;
return 1;
}
void solve()
{
int i, j, m, mask, div, sgn;
ll sol = 0;
for (i = 2; i <= 1000; ++i)
if (pr(i))
prim[++ct] = i;
for (i = 1; i <= n; ++i)
{
m = 0;
for (j = 1; j <= ct; ++j)
if (sir[i] % prim[j] == 0)
{
p[++m] = prim[j];
while (sir[i] % prim[j] == 0)
sir[i] /= prim[j];
}
if (sir[i] != 1) p[++m] = sir[i];
sol += i - 1;
for (mask = 1; mask < 1 << m; ++mask)
{
div = 1;
sgn = 1;
for (j = 0; j < m; ++j)
if ((mask >> j) & 1)
{
sgn = -sgn;
div *= p[j + 1];
}
sol += sgn * nr[div];
}
for (mask = 1; mask < 1 << m; ++mask)
{
div = 1;
for (j = 0; j < m; ++j)
if ((mask >> j) & 1)
div *= p[j + 1];
++nr[div];
}
}
printf("%lld\n", sol);
}
int main()
{
freopen("pairs.in", "r", stdin);
freopen("pairs.out", "w", stdout);
citire();
solve();
return 0;
}