Pagini recente » Cod sursa (job #1938152) | Diferente pentru propuneri/16-reorganizare-arhiva intre reviziile 6 si 2 | Cod sursa (job #1441729) | Cod sursa (job #1803363) | Cod sursa (job #1897320)
#include <cstdio>
#include <algorithm>
#define MAXE 100001
#define MAXN 1000001
using namespace std;
int sieve[MAXN], number[MAXN];
bool bad[MAXN], frq[MAXN];
int main()
{
freopen("pairs.in", "r", stdin);
freopen("pairs.out", "w", stdout);
int prime, n, m = -1, x;
long long ans = 0, i;
scanf("%d", &n);
for(i=1; i<=n; ++i) {
scanf("%d", &x);
frq[x] = 1;
if(m < x) m = x; }
for(prime=1; prime<=m; ++prime)
for(i=prime; i<=m; i+=prime)
number[prime] += (frq[i]==1);
for(prime=2; prime<=m; ++prime)
if(!sieve[prime]) {
for(i=prime; i<=m; i+=prime)
sieve[i]++;
for(i=1LL*prime*prime; i<=m; i+=prime*prime)
bad[i] = 1; }
for(i=1; i<=m; ++i){
if(bad[i]) continue;
else {
if(sieve[i]&1) ans -= 1LL*number[i]*(number[i]-1);
else ans += 1LL*number[i]*(number[i]-1); } }
printf("%lld", ans/2);
return 0;
}