zoukankan      html  css  js  c++  java
  • 有关莫比乌斯反演

    对于两个定义域为整数的函数F(x)和f(x);

    若有:

    然后F(x)可以快速求出;

    如何用F求解f呢?

    莫比乌斯反演:

    对于两个定义域为整数的函数F(x)和f(x);

    若有:

    则有:

    其中μ(x)为莫比乌斯函数,其定义为:

    对于(pi为质数)

    若对于任意i存在ki>1,则μ(x)=0;

    否则若质因子的个数为偶数,则μ(x)=1;

    若质因子的个数为奇数,则μ(x)=-1;

    有了这个定义之后;

    为什么这是对的呢?

    莫比乌斯函数有如下性质:

          μ(1)=1;

    证明:

    观察上式,其含义为x的所有因子的μ和;

    若x有重复质因子,则di可能有重复质因子,

    但这样的话μ(di)为零;

    把μ为0的部分放在一边;

    剩下各自不含重复质因子的di了;

    设x有k种质因子;

    则设

    显然,有

    于是

    多项式定理(杨辉三角)

    带入x=-1,a=1,得证;

    于是,莫比乌斯函数有了这样的性质:

    这可以用来证明莫比乌斯反演;

     

    证明:

     

    发现:d的集合完全等于k的集合;

    对于每一个k,考虑f(k)对答案的贡献;

    发现在上式中;

     f(k)对答案贡献f(k)·μ(d)

    于是:

    由莫比乌斯函数的性质可知:

    于是

    得证;

    莫比乌斯反演的另一种形式:

    若有

    则有

    证明思路大同小异,省去;

    莫比乌斯函数的求法:

    莫比乌斯函数是积性函数(易证);

    于是可线性筛求解;

    代码如下:

    void prime(){
        int i,j;
        vis[1]=true;mob[1]=1;
        for(i=2;i<=MAXN;i++){
            if(!vis[i])
                pri[++cnt]=i,mob[i]=-1;
            for(j=1;j<=cnt&&pri[j]*i<=MAXN;j++){
                vis[i*pri[j]]=true;
                if(i%pri[j])
                    mob[i*pri[j]]=-mob[i];
                else{
                    mob[i*pri[j]]=0;break;
                }
            }
        }
    }
  • 相关阅读:
    Scramble String
    Burst Balloons
    Coins in a Line III
    maven初识
    Java类加载器初识
    HTTP协议
    Map和Set的联系
    Thread类与Runnable接口
    Throwable和Exception的区别
    SpringMVC的@ResponseBody注解简介
  • 原文地址:https://www.cnblogs.com/nietzsche-oier/p/6821915.html
Copyright © 2011-2022 走看看