莫比乌斯反演

莫比乌斯函数,它的定义如下:

 

    (1)若,那么

    (2)若均为互异素数,那么

    (3)其它情况下



莫比乌斯函数是一个数论函数,它同时也是一个积性函数(i.e.μ(ab) =μ(a)μ(b), a,b互质)
当n不等于1时,n所有因子的莫比乌斯函数值的和为0,

莫比乌斯函数计算模板:

O(nlogn)

void getMu(){  
    int N=maxn;  
    for(int i=1;i<N;++i){  
        int target=i==1?1:0;  
        int delta=target-mu[i];  
        mu[i]=delta;  
        for(int j=2*i;j<N;j+=i)  
            mu[j]+=delta;  
    }  
}  


O(n)

#define MAXN 101
bool vis[MAXN];
int primes[MAXN];
int miu[MAXN];

void calc(int limit)
{
    memset(vis, false, sizeof(vis));
    memset(miu, 0, sizeof(miu));
    int tot = 0;
    miu[1] = 1;   //根据定义,μ(1) = 1
    for(int i = 2; i <= limit; i++)
    {
        if(!vis[i])  //未发现的质数
        {
            primes[tot++] = i;
            miu[i] = -1;
                //质数,除了1以外,只有它自己是自己的质因数
                //因此根据定义,μ(i) = (-1)^1 = -1
        }
        for(int j = 0; j < tot; j++)
        {
            int k = i*primes[j];   
            if(k > limit)break;
            vis[k] = true;
            if(i % primes[j]) //i不是primes[j]的整数倍时,i*primes[j]就不会包含相同质因子。
                miu[k] = -miu[i];     //此时根据其积性函数的特性得 miu[k] = miu[i]*miu[primes[j]],因为primes[j]是质数,miu值为-1
            else                      //然后化简得miu[k] = -miu[i]; (perfect!)
                break;                
        }
    }
}


莫比乌斯反演:



这两种都是莫比乌斯反演的表示方法。



莫比乌斯反演的应用:

对于类似于莫比乌斯反演的求和函数

一般我们可以用O(1) 时间求得F(i),但f(i)可能要用O(n*n)的时间去求,乃至更多。

这时我们就可以用莫比乌斯反演(或变形),得

这样用O(n)的时间就可以求出f(i),而不是O(n*n)乃至更多,大大降低了时间复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值