莫比乌斯函数

单点求解sqrt(n)  (可以自己改写,很简单)

int f[maxn],cc;
void solve(int n){
    cc=0;
    for(int i=2;i*i<=n;++i){
        if(n%i==0){
            while(n%i==0)
                f[++cc]=i,n/=i;
        }
    }
    if(n>1)f[++cc]=n;
}
int getmiu(int n){
    if(n==1)return 1;
    solve(n);
    for(int i=1;i<cc;++i)
        if(f[i]==f[i+1])return 0;
    return (cc&1)?-1:1;
}

筛法递推

bool vis[maxn];
int prim[maxn];
int mu[maxn];
int cnt;
void get_mu(int n) {
    mu[1]=1;
    for(int i=2; i<=n; i++) {
        if(!vis[i]) {
            prim[++cnt]=i;
            mu[i]=-1;
        }
        for(int j=1; j<=cnt && prim[j]*i<=n; j++) {
            vis[prim[j]*i]=1;
            if(i%prim[j]==0) break;
            else mu[i*prim[j]]=-mu[i];
        }
    }
}

解释一下线性筛

设a=x*x*y*y*z(x<y<z)

a仅会被x筛到

因为x*x*y*z在筛到素数x时就已经break了,同理x*x*y*y不会筛到z

因此,每个数仅被他的最小质因子筛到,因此为O(n),这一性质也是可以利用的

 

解释一下莫比乌斯函数

由于每个数都是被它的最小质因子筛到

考虑一个数去除掉最小质因子,x=i*prim[j]

假如x是k个素数连乘,那么mu[x]=-mu[i]没毛病

假如x里有a*a

  如果a是最小质因子,直接break掉,就等于数组初始值没毛病

  如果a不是最小质因子,x的最小质因子是b,那么x/b的mu值已经处理好为0,那么mu[x]=-mu[x/b]也是没毛病的

 

性质  (copy的别人blog)

 

 

 对于性质莫比乌斯函数可用来容斥

发现对于n>1, sigma(mu(d), d|n) = C(n,0 )- C( n,1 )+ C(n,2) +.... + (-1)^(n) * C(n,n)  =  (1-1)^n  = 0

有p^2因子的莫比乌斯值是0,当然不用考虑

-C(n,2) 表示n的因子中,有C(n,2) 个素因子个数为2

因此这是一个容斥函数,所以才有了下面的莫比乌斯反演

莫比乌斯反演有两种形式,除了上面还有一种,对于两种形式用类似的方式可以理解一下

posted on 2019-01-07 13:52  scau_bi  阅读(269)  评论(0编辑  收藏  举报

导航