Pagini recente » Cod sursa (job #1538370) | Cod sursa (job #2896462) | Cod sursa (job #2939306) | Cod sursa (job #772059) | Cod sursa (job #547681)
Cod sursa(job #547681)
#include<stdio.h>
#define Nmax 1000010
int fact[Nmax], v[Nmax], s[1000] ;
bool viz[Nmax], ciur[Nmax] ;
int i,n,x,K,j;
long long sol, P, Max ;
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 )
{
if( k&1 )
sol += ((1LL*v[P]*(v[P]-1))>>1);
else
sol -= ((1LL*v[P]*(v[P]-1))>>1);
back(k+1);
P /= fact[i];
}
else
{
P /= fact[i];
return ;
}
}
}
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 ;
}
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;
}