Pagini recente » Cod sursa (job #752172) | Cod sursa (job #762861) | Cod sursa (job #2043726) | Cod sursa (job #2770343) | Cod sursa (job #2502791)
#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+100];
short int a[VALMAX+100];
int sol, n;
bool ciur[VALMAX+100], b[VALMAX+100], parity[VALMAX+100];
vector <int> prime[VALMAX+100];
void ciurul()
{ ciur[0] = ciur[1] = 1;
for(int i=2; i<=VALMAX; i++)
if(!ciur[i])
{ for(int j=i; j<=VALMAX; j+=i)
{ ciur[j] = 1;
parity[j] = 1 - parity[j];
if(b[j]) prime[j].push_back(i);
}
}
}
void pinex(int x)
{ int m = prime[x].size();
for(int mask=1; mask<(1<<m); mask++)
{ int p = 1;
for(int i=0; i<m; i++) if(mask & (1 << i)) p = p * prime[x][i];
a[p]++;
}
}
int main()
{
f >> n;
for(int i=1; i<=n; i++)
{ f >> v[i];
b[v[i]] = 1;
}
ciurul();
for(int i=1; i<=n; i++) pinex(v[i]);
for(int i=2; i<=VALMAX; i++)
{ if(parity[i]) 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;
}