Pagini recente » Cod sursa (job #3130516) | Cod sursa (job #2890684) | Cod sursa (job #42399) | Cod sursa (job #2393641) | Cod sursa (job #109386)
Cod sursa(job #109386)
#include <cassert>
#include <cstdio>
using namespace std;
enum { maxn = 100002, maxv = 1000002 };
int n;
int num[maxn];
bool exists[maxv];
int divs[maxv]; //divizori distincti != 1
long long ans;
inline long long c2(int val)
{
assert(val >= 0);
long long ret = val;
ret *= (val - 1);
ret /= 2;
return ret;
}
void go()
{
int now, val, count;
ans = c2(n);
for(now = 2; now < maxv; now++)
{
if(exists[now])
count = 1;
else
count = 0;
for(val = now + now; val < maxv; val += now)
{
if(divs[now] == 0) //prime
divs[val]++;
if(exists[val])
count++;
}
if(divs[now] != 1) //considered before
{
if(divs[now] == 0 || divs[now] % 2)
ans -= c2(count);
else
ans += c2(count);
}
}
}
int main()
{
freopen("pairs.in", "r", stdin);
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &num[i]);
exists[ num[i] ] = true;
}
go();
freopen("pairs.out", "w", stdout);
printf("%lld\n", ans);
return 0;
}