Pagini recente » Cod sursa (job #1165088) | Cod sursa (job #129732) | Cod sursa (job #2626317) | Cod sursa (job #123888) | Cod sursa (job #1018806)
#include <fstream>
#define maxn 100001
#define maxv 1000001
using namespace std;
ifstream fin("pairs.in");
ofstream fout("pairs.out");
bool sieve[maxv],v[maxv];
int p[maxn],fac[maxn],nr[maxv],mark[maxv],maxval=0;
int t,tt,prod,n,x;
long long s;
void erathostenes (int n)
{
t=1;
p[1] = 2;
for (int i=3; i<=n; i+=2)
{
int ok=0;
if (!sieve[i])
{
ok |= v[i];
for (int j=i+i; j<=n; j+=i)
{
sieve[j] = 1;
ok |= v[j];
}
if (ok)
{
p[++t] = i;
}
}
}
}
void back (int k, int cnt)
{
if (prod > maxval)
return;
for (int i=k; i<=t; ++i)
{
prod *= p[i];
back (i+1,cnt+1);
prod /= p[i];
}
if (prod != 1)
{
fac[++tt] = prod;
nr[prod] = cnt;
}
}
int main()
{
fin>>n;
for (int i=1; i<=n; ++i)
{
fin>>x;
v[x]=1;
maxval = max (x,maxval);
}
erathostenes (maxval);
prod = 1;
back (1,0);
for (int i=1; i<=tt; ++i)
{
for (int j=fac[i]; j<=maxval; j+=fac[i])
{
if (v[j]) mark[fac[i]]++;
}
}
s=0;
for (int i=1; i<=maxval; ++i)
{
if (nr[i]%2)
{
s += (mark[i]*(mark[i]-1)/2);
}
else
{
s -= (mark[i]*(mark[i]-1)/2);
}
}
fout<<1LL*n*(n-1)/2-s;
}