埃氏筛
void euler ( int n )
{
for ( int i = 1 ; i <= n ; i++) phi [ i ] = i ;
for ( int i = 2 ; i <= n ; i++)
{
if ( phi [ i ] == i )
{
for ( int j = i ; j <= n ; j += i )
{
phi [ j ] = phi [ j ] / i * ( i - 1 ) ;
}
}
}
}
欧拉筛
void euler ( int n )
{
phi [ 1 ] = 1 ;
for ( int i = 2 ; i <=n ; i++ )
{
if ( vis [ i ] == false )
{
prime [ ++cnt ] = i ;
phi [ i ] = i - 1 ;
}
for ( int j = 1 ; j <= cnt && prime [ j ] * i <= n ; j++ )
{
vis [ i * prime [ j ] ] = true ;
if ( i % prime [ j ] == 0 )
{
phi [ i * prime [ j ] ] = phi [ i ] * prime [ j ] ;
break ;
}
else phi [ i * prime [ j ] ] = phi [ i ] * phi [ prime [ j ] ] ;
}
}
}