Pagini recente » Cod sursa (job #1485266) | Cod sursa (job #2776823) | Cod sursa (job #2361015) | Cod sursa (job #500652) | Cod sursa (job #2502846)
#include <cstdio>
#include <vector>
#include <iostream>
#define NMAX 100000
#define VALMAX 1000000
using namespace std;
int v[NMAX+10], a[VALMAX+100], n;
bool parity[VALMAX+100];
long long sol;
vector <int> prime[NMAX+10];
void findPrimes(int poz)
{ int x = v[poz];
for(int d=2; d*d<=x && x!=1; d++)
if(x % d == 0)
{ prime[poz].push_back(d);
while(x % d == 0) x /= d;
}
if(x != 1) prime[poz].push_back(x);
}
void pinex(int poz)
{ int m = prime[poz].size();
for(int mask=1; mask<(1<<m); mask++)
{ long long p = 1, nr = 0, u = 1;
for(int i=0; i<m; i++) if(mask & (1 << i)) p = p * prime[poz][i], nr++;
a[p]+=u;
parity[p] = nr % 2;
}
}
int main()
{
freopen("pairs.in", "r", stdin);
freopen("pairs.out", "w", stdout);
scanf("%lld", &n);
for(int i=1; i<=n; i++)
{ scanf("%d", &v[i]);
findPrimes(i);
pinex(i);
}
for(int i=2; i<=VALMAX; i++)
{ if(parity[i] & 1) sol = sol + (long long)a[i] * ((long long)a[i]-1) / 2;
else sol = sol - (long long)a[i] * ((long long)a[i]-1) / 2;
}
printf("%lld\n", (long long)n*((long long)n-1)/2-sol);
return 0;
}