Pagini recente » Cod sursa (job #268948) | Cod sursa (job #66264) | Cod sursa (job #459296) | Cod sursa (job #1839528) | Cod sursa (job #547756)
Cod sursa(job #547756)
#include<stdio.h>
#define Nmax 1000010
int fact[Nmax>>3], v[Nmax], s[20] ;
bool viz[Nmax], ciur[Nmax] ;
int i,n,x,K,j;
long long sol, P, Max, val ;
void precalc()
{
long long i,j ;
fact[++K] = 2 ;
for( i = 3 ; i <= Max; i += 2 )
{
if( ciur[i] ) continue ;
fact[++K] = i ;
for( j = i*i ; j <= Max ; j += (i<<1) )
ciur[j] = true ;
}
}
void back ( int k )
{
int i ;
for( i = s[k-1] + 1 ; i <= K ; i++ )
{
s[k] = i ;
P *= fact[i] ;
if( P <= Max )
{
val = ((1LL*v[P]*(v[P]-1))>>1);
if( k & 1 )
sol += val ;
else
sol -= val ;
back(k+1);
P /= fact[i];
}
else
{
P /= fact[i];
break ;
}
}
}
int main()
{
freopen("pairs.in","r",stdin);
freopen("pairs.out","w",stdout);
scanf("%d",&n);
for( i = 1 ; i <= n ; i++ )
{
scanf("%d",&x);
viz[x] = true ;
if( x > Max ) Max = x ;
if( x == 1 ) sol = n - 1 ;
}
precalc();
for( i = 1 ; i <= Max ; i++ )
for( j = i ; j <= Max ; j += i )
if( viz[j] ) v[i]++;
P = 1 ;
back(1);
printf("%lld",sol);
return 0;
}