Pagini recente » Statisticile problemei Fotbal | Cod sursa (job #943592) | Cod sursa (job #1404043) | Cod sursa (job #690680) | Cod sursa (job #2728618)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("pairs.in");
ofstream fout ("pairs.out");
const int maxM = 1e6;
int fr[maxM], vizitat[maxM], nrdivp[maxM];
int main()
{
int maxim = 0;
long long n; fin >> n;
for(int i = 1; i <= n; ++i) {
int x; fin >> x;
maxim = max(x, maxim);
fr[x] += 1;
}
long long ans = (n-1) * n / 2; // nr total de perechi
for(int i = 2; i <= maxim; ++i)
if(vizitat[i] == 0) { // nu este o combinatie de forma a^n * b^m...
long long ok = 0, cnt = 0;
if(nrdivp[i] == 0) // este numar prim
ok = 1;
for(int j = i; j <= maxim; j += i) {
if(ok == 1) {
nrdivp[j]++; // din cati factori primi este format j
if(j % (i*i) == 0)
vizitat[j] = 1;// este o combinatie de forma i^2 * ceva, deci nu ne intereseaza pe viitor
}
cnt += fr[j]; // cate numere mai mari decat i sunt in M;
}
if(nrdivp[i] % 2 == 1)
ans -= (cnt-1) * cnt / 2;
else
ans += (cnt-1) * cnt / 2;
}
fout << ans;
return 0;
}