莫比乌斯反演总结

莫比乌斯反演

Tags:数学

作业部落

评论地址


引用

YYB:http://www.cnblogs.com/cjyyb/p/7953803.html
YL:http://www.cnblogs.com/cjoieryl/p/8250019.html
ZSY:http://www.cnblogs.com/zhoushuyu/p/8186224.html

一、基本内容

《组合数学》P142写了详细内容,这里简单提一下:

Step1 Mobius函数

定义:

\[\mu(d)=\begin{cases} 1\quad \quad \quad d=1\\ {(-1)}^r \quad d=p1p2p3...pr\\ 0\quad \quad \quad 其他\end{cases}\]

定理:

对于任意正整数n,恒有\[\sum_{d|n}\mu(d)=\begin{cases} 1 \quad n=1 \\ 0 \quad n>1 \end{cases}\]

证明:

\(n\)\(1\)的时候很好证明,\(n>1\)的如下
首先\(n\)转化为\(n'\)\(n={p1}^{a1}{p2}^{a2}...{pk}^{ak}\),\(n'=p1p2...pk\)
那么对于\(d\)\(n|d\)那么\(\mu(d)\)无贡献,推出\(\mu(n)=\mu(n')\)
\(k\)个质数中选\(0\)个(偶数个系数是\(1\),由定义得)\(+C(k,0)\),选\(1\)个(奇数个系数是\(-1\)\(-C(k,1)\),最后的式子就是(组合数公式)
\[C(k,0)-C(k,1)+C(k,2)-...\pm C(k,k)=0\]

Step2 Mobius反演

形式A

\[g(x)=\sum_{d|x}f(d)\]
\[f(x)=\sum_{d|x}\mu(\frac{x}{d})g(d)\]

形式B

\[g(x)=\sum_{x|d}^{n}f(d)\]
\[f(x)=\sum_{x|d}^{n}\mu(\frac{d}{x})g(d)\]
这里给出形式\(A\)的证明

证明:

\[f(x)=\sum_{d|x}\mu(\frac{x}{d})\sum_{d'|d}f(d')\]
对于每一个\(f(d')\),如果说它要被计算到,那么一定存在一个\(d\)使得\(d|x\)\(d'|d\)
那么就是\(\frac{x}{d'}|\frac{x}{d}\),被计算的次数是\(\mu(\frac{x}{d})\)
\[f(x)=\sum_{d'|x}f(d')\sum_{\frac{x}{d'}|\frac{x}{d}}\mu(\frac{x}{d})\]
然后由上面的定理得出当且仅当\(\frac{x}{d}\)\(1\)\(\mu(\frac{x}{d})\)不为\(0\),为\(1\),进而
\[x=d,f(x)=\sum_{d'|1}f(d')=f(x)\]
形式\(B\)同理可证,核心思想是把贡献提出来

Step 3 举个例子

求:\[\sum_{i=1}^{N}\sum_{j=1}^{M}[gcd(i,j)==1]\]

Way 1

\[f(x)=\sum_{i=1}^{N}\sum_{j=1}^{M}[gcd(i,j)==x]\]
\[g(x)=\sum_{x|d}^{min(N,M)}f(d)\]
那么(中括号内表示成立为\(1\)否则为\(0\)\[g(x)=\sum_{x|d}^{min(N,M)}\sum_{i=1}^{N}\sum_{j=1}^{M}[gcd(i,j)==d]\]\[=\sum_{i=1}^{N}\sum_{j=1}^{M}[x|gcd(i,j)]=\lfloor\frac{N}{x}\rfloor\lfloor\frac{M}{x}\rfloor\]
进而\[f(x)=\sum_{x|d}^{min(N,M)}\mu({\frac{d}{x}})g(d)\]\[f(1)=\sum_{i=1}^{min(N,M)}\mu(i)\lfloor\frac{N}{i}\rfloor\lfloor\frac{M}{i}\rfloor\]
加上数论分块可以\(O(\sqrt{N})\)完成(数论分块例题

Way 2

由上面的莫比乌斯函数的定理可以知道\[[gcd(i,j)==1]=\sum_{d|gcd(i,j)}\mu(d)=\sum_{d|i,d|j}\mu(d)\]
所以说\[Ans=\sum_{i=1}^{N}\sum_{j=1}^{M}\sum_{d|i,d|j}\mu(d)\]
提贡献:把\(d\)提到前面来\[Ans=\sum_{d=1}^{min(N,M)}\mu(d)\sum_{d|i}^{N}\sum_{d|j}^{M}1\]\[Ans=\sum_{d=1}^{min(N,M)}\mu(d)\lfloor\frac{N}{d}\rfloor\lfloor\frac{M}{d}\rfloor\]

二、题目

1、练基础

  • [x] 【HDU】GCD https://vjudge.net/problem/HDU-1695
  • [x] 【Luogu】[POI2007]ZAP-Queries https://www.luogu.org/problemnew/show/3455
  • [x] 【Luogu】[HAOI2011]Problem b https://www.luogu.org/problemnew/show/P2522
  • [x] 【Luogu】[SDOI2008]仪仗队 https://www.luogu.org/problemnew/show/P2158
  • [x] 【SPOJ】Visible Lattice Points https://vjudge.net/problem/SPOJ-VLATTICE
  • [x] 【ZOJ】Ideal Puzzle Bobble https://vjudge.net/problem/ZOJ-3435
  • [x] 【Luogu】[NOI2010]能量采集 https://www.luogu.org/problemnew/show/P1447
  • [x] 【CJOJ】gcd之和 https://oj.changjun.com.cn/problem/detail/pid/2512
  • [x] 【UVa】GCD-Extreme(II) https://vjudge.net/problem/UVA-11426
  • [x] 【Luogu】[国家集训队]Crash的数字表格 https://www.luogu.org/problemnew/show/P1829
  • [x] 【Luogu】GCD https://www.luogu.org/problemnew/show/P2568
  • [x] 【Luogu】Hillan and the girl https://vjudge.net/problem/HDU-5663

2、刷提高

  • [x] 【BZOJ】完全平方数 https://ruanx.pw/bzojch/p/2440.html
  • [x] 【COGS】jzptab http://cogs.pro:8080/cogs/problem/problem.php?pid=2031
  • [x] 【HDU】Mophues https://vjudge.net/problem/HDU-4746
  • [x] 【HDU】Code https://vjudge.net/problem/HDU-5212
  • [x] 【Luogu】YY的GCD https://www.luogu.org/problemnew/show/P2257
  • [x] 【COGS】[BZOJ4407]于神之怒加强版 http://cogs.pro:8080/cogs/problem/problem.php?pid=2156

    3、变态题

  • [x] 【Luogu】P3327 [SDOI2015]约数个数和(我的题解)https://www.luogu.org/problemnew/show/3327
  • [x] 【SNMOJ】[安师大]sanrd(我的题解) http://172.40.26.251/contest/55/problem/290
  • [ ] 【SDOI2014】数表 https://www.luogu.org/problemnew/show/P3312

三、做题经验

1、Mobius求解以下问题

\(A、\)[POI2007]ZAP-Queries题解戳我
  \(O(\sqrt{n})\)求下式(预处理\(O(n)\),还有拓展到\(n\)\(sigma\)Visible Lattice Points
\[\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)==k]\]
\(B、\)Gcd之和题解戳我
  \(O(n)\)求下式(jzptab要求单次询问\(O(\sqrt{n})\)题解戳我
\[\sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j)\]
\(C、\)Crash的数字表格->单次\(O(n)\)求下式
  jzptab->单次\(O(\sqrt{n})\)求下式(题解戳我
\[\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)\]
\(D、\)Mophues题解戳我/题解戳我
  \(O(n\sqrt{n})\)预处理并单次\(O(\sqrt{n})\)求下式,\(Fact(i)\)表示\(i\)唯一分解后不同质因子的个数
\[\sum_{i=1}^{n}\sum_{j=1}^{m}[Fact(gcd(i,j))<=P]\]
\(E、\)Code题解戳我
  构造函数单次\(O(n\sqrt{n})\)求下式,\(A\)为给定的一个数列,\(A[i]<=1w\)
\[\sum_{i=1}^{n}\sum_{j=1}^{n}gcd(A[i],A[j])*(gcd(A[i],A[j])-1)\]
\(F、\)约数个数和题解戳我【自己写的】
  \(O(n)\)预处理并单次询问\(O(\sqrt{n})\)处理下式,\(d(i)\)\(i\)的约数个数详见引理\(B\)\[\sum_{i=1}^{n}\sum_{j=1}^{m}d(ij)\]

\(G、\)YY的GCD题解戳我
  \(O(n)\)预处理并单次询问\(O(\sqrt{n})\)处理下式\[\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)为质数?1:0]\]
\(H、\)Hillan and the girl题解戳我
  \(O(n)\)\(O(nloglogn)\)预处理并单次询问\(O(\sqrt{n})\)\[\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)为完全平方数?1:0]\]

\(I、\)于神之怒加强版题解戳我
  \(O(n)\)预处理并单次询问\(O(\sqrt{n})\)\[\sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j)^k\]

\(J、\)数字表格题解戳我
  \(O(nloglogn)\)预处理并且单次询问\(O(\sqrt{n})\),其中\(Feb(i)\)表示斐波那契数列第i项,\(Feb(0)=0,Feb(1)=1...\)\[\prod_{i=1}^{n}\prod_{j=1}^{m}Feb(gcd(i,j))\]

2、小套路

\(A、\mu\)只会用到\(min(N,M)\)所以筛的时候可以不用筛到\(MAXN\)(助力冲榜)
\(B、\)数论分块套路(当数论分块会比较麻烦的时候可以用\(Map\)

  • 数论分块\(\lfloor{\frac{n}{i}}\rfloor\)\([l,r]\)的值一定,则\[r=\lfloor{\frac{n}{\lfloor\frac{n}{l}\rfloor}}\rfloor即r=n/(n/l)\]
  • 数论分块\(\lfloor{\frac{n}{i^2}}\rfloor\)\([l,r]\)的值一定,则\[r=\lfloor{\sqrt{\lfloor\frac{n}{\lfloor\frac{n}{l^2}\rfloor}}\rfloor}\rfloor即r=sqrt(n/(n/l/l))\]
  • 数论分块\(\lfloor\sqrt{\lfloor{\frac{n}{i}}\rfloor}\rfloor\)\([l,r]\)的值一定则\[r=\lfloor{\frac{n}{(\lfloor\sqrt{\lfloor\frac{n}{l}\rfloor}\rfloor)^2}}\rfloor即r=n/(sqrt(n/l)*sqrt(n/l))\]
  • 总结

    \(n\)\(l\)表示\(x\),然后尝试用\(n\)\(x\)\(l\)表示回去,就得到了\(r\)
    \(Sample1\)    \(x=\lfloor\frac{n}{l}\rfloor\)\(l=\lfloor\frac{n}{x}\rfloor\)\(r=\lfloor{\frac{n}{\lfloor\frac{n}{l}\rfloor}}\rfloor\)
    \(Sample2\)    \(x=\lfloor\frac{n}{l^2}\rfloor\)\(l=\lfloor\sqrt{\lfloor\frac{n}{x}\rfloor}\rfloor\)\(r=\lfloor{\sqrt{\lfloor\frac{n}{\lfloor\frac{n}{l^2}\rfloor}}\rfloor}\rfloor\)
    \(Sample3\)    \(x=\lfloor\sqrt{\lfloor\frac{n}{l}\rfloor}\rfloor\)\(l=\lfloor\frac{n}{x^2}\rfloor\)\(r=\lfloor{\frac{n}{(\lfloor\sqrt{\lfloor\frac{n}{l}\rfloor}\rfloor)^2}}\rfloor\)

\(C、\)\(gcd\)套路(把\(gcd\)换成字母\(d\),从枚举\(i,j\)改成枚举\(d\)
\(D、\)提贡献套路(换元思想)
  令\(T=id\)然后把里面的\(sigma\)提取到外面,统计贡献
\(E、\)构造函数套路(Code),不过不常用也很难想
\(F、\)线性筛积性函数,详见另一篇笔记《积性函数与线性筛

3、注意事项

\(A、\)数据范围大的时候注意随时取模!!
\(B、\)有时候卡空间/时间,那么能用\(int\)尽量\(int\)随时\(1LL\)

4、引理

\(A、\)\[\lfloor{\frac{\frac{n}{i}}{d}}\rfloor=\lfloor{\frac{n}{id}}\rfloor\]  令\(n=a*(id)+b\)\(b < id\)
  那么\(\lfloor\frac{n}{i}\rfloor=a*d+\lfloor\frac{b}{i}\rfloor,\lfloor\frac{b}{i}\rfloor< d\)
  \(\lfloor{\frac{\frac{n}{i}}{d}}\rfloor=a=\lfloor{\frac{n}{id}}\rfloor\)
  
\(B、\)\[d(nm)=\sum_{i|n}\sum_{j|m}[gcd(i,j)==1]\]
  \(d(x)\)表示\(x\)的约数个数,如\(d(6)=4\)
  任意\(nm\)的约数可以表示为\(i*\frac{m}{j}\)
  如果\(gcd(i,j)!=1\),可以令\(i=k_1p,j=k_2p\)\(i*\frac{m}{j}\)表示的约数是\(\frac{k_1}{k_2m}\),但是我们可以发现当\(i=k_1,j=k_2\)的时候就已经统计过这个约数了,再不懂可以手玩\(4*6\)
  (Upd2018.8.15:公式写错了已更正 @Tyher)

有关原创文章

线性筛
题解
题解

Code

\(\mu(x)\)

void Mobius()
{
    mu[1]=1;ispri[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!ispri[i]) {pri[++tot]=i;mu[i]=-1;}
        for(int j=1;j<=tot&&i*pri[j]<=n;j++)
        {
            ispri[i*pri[j]]=1;
            if(i%pri[j])mu[i*pri[j]]=-mu[i];
            else break;
        }
    }
    for(int i=1;i<=n;i++)s[i]=s[i-1]+mu[i];
}

转载于:https://www.cnblogs.com/xzyxzy/p/8313371.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值