Pagini recente » Cod sursa (job #856264) | Cod sursa (job #1664500) | Cod sursa (job #2605343) | Cod sursa (job #2921086) | Cod sursa (job #2502853)
#include <fstream>
#include <iostream>
#include <vector>
#define NMAX 100000
#define VALMAX 1000000
using namespace std;
ifstream f("pairs.in");
ofstream g("pairs.out");
int a[VALMAX+100], b[VALMAX+100], n;
long long sol;
bool ciur[VALMAX+100], parity[VALMAX+100];
vector <int> prime[NMAX+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;
if(b[j]) prime[b[j]].push_back(i);
}
}
}
void pinex(int x)
{ int m = prime[x].size();
for(int mask=1; mask<(1<<m); mask++)
{ int p = 1, nr = 0, u = 1;
for(int i=0; i<m; i++) if(mask & (1 << i)) p = p * prime[x][i], nr++;
a[p]+=u;
parity[p] = nr % 2;
}
}
int main()
{
f >> n;
for(int i=1; i<=n; i++)
{ int x;
f >> x;
b[x] = i;
}
ciurul();
for(int i=1; i<=n; i++) pinex(i);
for(int i=2; i<=VALMAX; i++)
{ if(parity[i]) 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;
}
g << (long long)n*((long long)n-1)/2 - sol << '\n';
return 0;
}