!-- Loading 底层遮罩 -->

欧拉函数

埃氏筛

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 ] ] ;
         }
    }
}
 

 

posted @ 2022-03-30 18:46  Thinker-X  阅读(24)  评论(0)    收藏  举报