莫比乌斯函数的两种求法(基于欧拉筛、埃氏筛)

35 篇文章 0 订阅

给出莫比乌斯函数的定义:

这里的n即u(i)中的i,即i=1时,u(1)=1;i大于1且i中某个质因子的幂超过1,则u(i)=0;否则,u(i)取决于其质因子个数的奇偶性。

这里给出两个莫比乌斯函数的性质:

简略证明性质1:
由唯一分解定理,在n的因子中,某个因子的质因子的幂超过1,那么u(d)=0,对于性质1我们不用管他,所以只研究质因子的幂全是1次的因子就行。假设n有质因子k个,那么,性质1可以转化成以下式子,即在k个质因子中选i个组成因子,因为i是奇数的时候,这个因子的莫比乌斯函数值是-1,所以奇数项全是负的,偶数项全是正的。

由二项式系数奇数项的和等于偶数项的和,在k>0时,这个式子不论k的奇偶,结果就是0;k=0时,即n=1时,这个式子的结果是1。

简略证明性质2:
先略过,会了再补充。

基于埃氏筛O(nloglogn)的方法求n以内的数的莫比乌斯函数:

const int N=1e6+10;
int mo[N];
void init(int n)
{
    mo[1]=1;
    for(int i=1;i<=n/2;i++)
    {
        if(mo[i]!=0)
        {
            for(int j=i*2;j<=n;j+=i)
                mo[j]-=mo[i];
        }
    }
}

基于欧拉筛O(n)的方法求n以内的数的莫比乌斯函数:

const int N=1e6+10;
bool vis[N];
int p[N],mo[N],cnt=0;
void init(int n)
{
    mo[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i])
        {
            p[++cnt]=i;
            mo[i]=-1;
        }
        for(int j=1;j<=cnt;j++)
        {
            if(i*p[j]>n)
                break;
            vis[i*p[j]]=1;
            if(i%p[j]==0)
                break;
            mo[i*p[j]]=-mo[i];
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值