Pagini recente » Cod sursa (job #699032) | Cod sursa (job #2970189) | Cod sursa (job #2538520) | Cod sursa (job #589899) | Cod sursa (job #1453166)
#include <stdio.h>
#include <set>
#include <vector>
#include <time.h>
#include <stdlib.h>
#define szs(x) ((int)(x).size())
#define i64 long long
#define vk (1 << 24)
#define dmax 1005
#define pb push_back
using namespace std;
i64 N;
vector <int> f, p;
int fk[vk], x;
char rng[dmax];
void ciurulika(){
p.pb(2);
for (int it = 3 ; it < dmax; it += 2)
rng[it] = 1;
for (int it = 3 ; it < dmax; it += 2){
if (!rng[it])
continue;
p.pb(it);
for (int j = (it << 1) + it; j < dmax; j += it << 1)
rng[j] = 0;
}
}
void doit (){
for (int it = 0 ; it < szs(p) && p[it] * p[it] <= x; ++ it){
if (x % p[it])
continue;
f.pb(p[it]);
while (x % p[it] == 0)
x /= p[it];
}
if (x > 1)
f.pb(x);
}
int main(){
freopen ("pairs.in", "r", stdin);
freopen ("pairs.out", "w", stdout);
scanf ("%lld", &N);
i64 Res = (1LL * N * (N - 1)) >> 1LL;
ciurulika();
for (int i = 0 ; i < N ; ++ i ){
scanf ("%d", &x);
f = vector <int>();
doit();
for (int mask = 1; mask < (1 << szs(f)); ++ mask){
int prod = 1, nr = 1;
for (int it = 0 ; it < szs(f); ++ it){
if ((1 << it) & mask)
prod *= f[it], nr ++;
}
nr = (nr & 1 ? 1 : -1);
Res += fk[prod] * nr;
++ fk[prod];
}
}
printf ("%lld", Res);
return 0;
}