AcWing算法提高课 容斥原理

容斥原理的复杂度是2^n,一般n不会很大

形如:

 

 

由于容斥原理一共有2^n中选法,可以用二进制枚举,1表示选择某个条件。

然后将偶数个1的状态加起来,奇数个1的状态减去

例题:

https://www.acwing.com/problem/content/216/

莫比乌斯函数:

定义:

 

用于结合容斥原理求和n互质的数的个数

 

其中,莫比乌斯函数就是Si的系数

求法:(筛质数的时候直接处理) 

 

模板:

void Init(int n)
{
    mobius[1]=[1];
    for(int i=2;i<=n;i++)
    {
        if(!not_primes[i])
        {
            primes[cnt++]=i;
            mobius[i]=-1;
        }
        for(int j=0;primes[j]*i<=n;j++)
        {
            not_primes[primes[j]*i]=true;
            if(i%primes[j]==0)
            {
                mobius[i*primes[j]]=0;//至少存在两个primes[j]因子
                break;
            }
            else
            {
                mobius[i*primes[j]]=mobius[i]*-1//i*primes[j]比i多一个质因子
            }
            
        }
    }
}
View Code

 

 数学知识:

 

 

 

 

 

 利用上图的g(x),可以求得[a/x](下取整)的同样值的数量(一共小于2sqrt(a)个)

此数量(每一跳就是g(x))

例题:https://www.acwing.com/problem/content/description/217/

 

posted @ 2022-10-10 18:24  80k  阅读(24)  评论(0编辑  收藏  举报