Pagini recente » Cod sursa (job #2840465) | Cod sursa (job #21719) | Cod sursa (job #350150) | Cod sursa (job #3128548) | Cod sursa (job #357305)
Cod sursa(job #357305)
using namespace std;
#include<cstdio>
#define MAX_N 1<<20
int N;
int nr[MAX_N]; // nr[i] = nr de nr care se impart la i
int nrd[MAX_N]; // nrd[i] = nr de divizori primi a lui i
bool viz[MAX_N];
long long Max;
void eratostene()
{
long long i,j;
for(i=2; i <= Max; ++i)
{
if(nrd[i] == 0)
{
for(j=i*i; j<=Max; j+=i*i) nrd[j] = -1;
for(j=i; j<= Max; j+=i) if(nrd[j] >= 0) ++nrd[j];
}
}
}
int main()
{
freopen("pairs.in","r",stdin);
freopen("pairs.out","w",stdout);
scanf("%d",&N);
long long sol = 0;
long long i,j, a;
for(i=1;i<=N;++i)
{
scanf("%lld",&a);
viz[a]=true;
if(a > Max) Max = a;
}
eratostene();
for(i = 2; i <= Max; ++i)
{
for(j=i;j<=Max;j+=i)
if(viz[j]) ++nr[i];
}
for(i=2;i<=Max;++i)
if(nrd[i] > 0)
if(nrd[i]&1) sol += (long long)nr[i]*(nr[i]-1)/2;
else sol -= (long long)nr[i]*(nr[i]-1)/2;
printf("%lld\n",(long long)N*(N-1)/2 - sol);
return 0;
}