Pagini recente » Cod sursa (job #994388) | Cod sursa (job #2229903) | Cod sursa (job #2730410) | Cod sursa (job #2529156) | Cod sursa (job #2502822)
#include <fstream>
#include <iostream>
#include <vector>
#define NMAX 100000
#define VALMAX 1000000
using namespace std;
ifstream f("pairs.in");
ofstream g("pairs.out");
int v[NMAX+10];
bool parity[VALMAX+100];
long long sol, a[VALMAX+100], n;
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()
{
f >> n;
for(int i=1; i<=n; i++)
{ f >> v[i];
findPrimes(i);
pinex(i);
}
for(int i=2; i<=VALMAX; i++)
{ if(parity[i] & 1) sol = sol + a[i] * (a[i]-1) / 2;
else sol = sol - a[i] * (a[i]-1) / 2;
}
g << n * (n-1) / 2 - sol << '\n';
return 0;
}