Pagini recente » Cod sursa (job #2413571) | Cod sursa (job #1037220) | Cod sursa (job #587650) | Cod sursa (job #613204) | Cod sursa (job #109673)
Cod sursa(job #109673)
#include <stdio.h>
#include <vector>
using namespace std;
#define nm 100100
#define mm 1048576
int n, crt = 1, a[nm], v[mm], c[mm], len[nm];
vector<int> d[nm];
long long sol;
void go(int x, int pos, int nr)
{
if (pos == len[x]) {
if (crt > 1) {
if (nr % 2 == 0)
sol = (long long)sol + c[crt];
else
sol = (long long)sol - c[crt];
++c[crt];
}
} else {
go(x, pos + 1, nr);
crt *= d[x][pos];
go(x, pos + 1, nr + 1);
crt /= d[x][pos];
}
}
int main()
{
freopen("pairs.in", "r", stdin);
freopen("pairs.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
for (int i = 2; i <= 1024; ++i) {
int ok = 1;
for (int j = 1; j <= v[0] && ok; ++j)
if (i % v[j] == 0)
ok = 0;
if (ok)
v[++v[0]] = i;
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; v[j] * v[j] <= a[i]; ++j)
if (a[i] % v[j] == 0) {
d[i].push_back(v[j]);
for (; a[i] % v[j] == 0; a[i] /= v[j]);
}
if (a[i] > 1)
d[i].push_back(a[i]);
len[i] = d[i].size();
sol = (long long)sol + i - 1;
go(i, 0, 0);
}
printf("%lld\n", sol);
return 0;
}