数论常用预处理

/*  线性筛求出莫比乌斯函数的值 
    利用积性函数的性质  */ 

mu[1] = 1;
for(int i = 2; i <= n; ++i)
{
    if(not_prime[i] == 0)
    {
        tot++;
        prime[tot] = i; mu[i] = -1; 
    }
    for(int j = 1; prime[j] * i <= n; ++j)
    {
        not_prime[prime[j] * i] = 1;
        if(i % prime[j] == 0)
        {
            mu[prime[j] * i] = 0;
            break;
        }
        mu[prime[j] * i] = -mu[i];
    }
} 

/* 线性筛欧拉函数 */ 
void get_eular()    
{    
    pnum = 0;  
    for(int i = 2; i < MAX; i++)    
    {    
        if(!noprime[i])    
        {    
            p[pnum ++] = i;    
            phi[i] = i - 1;    
        }    
        for(int j = 0; j < pnum && i * p[j] < MAX; j++)    
        {    
            noprime[i * p[j]] = true;    
            if(i % p[j] == 0)    
            {    
                phi[i * p[j]] = phi[i] * p[j];    
                break;    
            }    
            phi[i * p[j]] = phi[i] * (p[j] - 1);    
        }    
    }    
} 

线性筛素数

int is_prime[N], prime[N];
void get_prime(int n)
{
    for (int i = 1; i <= n; i++) is_prime[i] = true;
    is_prime[0] = is_prime[1] = false;
    int tot = 0;
    for (int i = 2; i <= n; i++)
    {
        if (is_prime[i]) prime[tot++] = i;
        for (int j = 0; j < tot && prime[j] * i <= n; j++)
        {
            is_prime[prime[j] * i] = false;
            if (i % prime[j] == 0) break;
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/Pedestrian6/p/9237160.html