莫比乌斯反演

什么是莫比乌斯反演?

我们先来看一个函数
F ( n ) = ∑ d ∣ n f ( d ) F(n)=\sum_{d|n}f(d) F(n)=dnf(d)
这里 d ∣ n d|n dn的意思是d能整除n,也就是说第一个函数可以由他的每一个因子带入另一个函数的和而求得,那我们先写出这个函数的前几项看看
F ( 1 ) = f ( 1 ) F(1)=f(1) F(1)=f(1)
F ( 2 ) = f ( 1 ) + f ( 2 ) F(2)=f(1)+f(2) F(2)=f(1)+f(2)
F ( 3 ) = f ( 1 ) + f ( 3 ) F(3)=f(1)+f(3) F(3)=f(1)+f(3)
F ( 4 ) = f ( 1 ) + f ( 2 ) + f ( 4 ) F(4)=f(1)+f(2)+f(4) F(4)=f(1)+f(2)+f(4)
F ( 5 ) = f ( 1 ) + f ( 5 ) F(5)=f(1)+f(5) F(5)=f(1)+f(5)
F ( 6 ) = f ( 1 ) + f ( 2 ) + f ( 3 ) + f ( 6 ) F(6)=f(1)+f(2)+f(3)+f(6) F(6)=f(1)+f(2)+f(3)+f(6)
F ( 7 ) = f ( 1 ) + f ( 7 ) F(7)=f(1)+f(7) F(7)=f(1)+f(7)
F ( 8 ) = f ( 1 ) + f ( 2 ) + f ( 4 ) + f ( 8 ) F(8)=f(1)+f(2)+f(4)+f(8) F(8)=f(1)+f(2)+f(4)+f(8)
然后我们试试用F(i)来表示f(i)那么就可以用几个F(i)的加减来解决了
f ( 1 ) = F ( 1 ) f(1)=F(1) f(1)=F(1)
f ( 2 ) = F ( 2 ) − F ( 1 ) f(2)=F(2)-F(1) f(2)=F(2)F(1)
f ( 3 ) = F ( 3 ) − F ( 1 ) f(3)=F(3)-F(1) f(3)=F(3)F(1)
f ( 4 ) = F ( 4 ) − F ( 2 ) f(4)=F(4)-F(2) f(4)=F(4)F(2)
f ( 5 ) = F ( 5 ) − F ( 1 ) f(5)=F(5)-F(1) f(5)=F(5)F(1)
f ( 6 ) = F ( 6 ) − F ( 3 ) − F ( 2 ) + F ( 1 ) f(6)=F(6)-F(3)-F(2)+F(1) f(6)=F(6)F(3)F(2)+F(1)
f ( 7 ) = F ( 7 ) − F ( 1 ) f(7)=F(7)-F(1) f(7)=F(7)F(1)
f ( 8 ) = F ( 8 ) − F ( 4 ) f(8)=F(8)-F(4) f(8)=F(8)F(4)
在反推的过程中我们其实可以得到一些规律, f ( n ) f(n) f(n)所对应的 F ( d ) F(d) F(d)必为其的一些系数,且 F ( d ) F(d) F(d)前面的正负号与另一个函数有关,那么我们可以假写出一个式子
f ( n ) = ∑ d ∣ n μ ( ? ) F ( d ) f(n)=\sum_{d|n}\mu(?)F(d) f(n)=dnμ(?)F(d)
可以认为 f ( n ) f(n) f(n) F ( d ) F(d) F(d)乘上一个系数而得到的,且系数可以认为是一个函数 μ ( d ) \mu(d) μ(d),我们写出 μ ( d ) \mu(d) μ(d)的前几项来看看
μ ( 1 ) = 1 , μ ( 2 ) = − 1 , μ ( 3 ) = − 1 , μ ( 4 ) = 0 , μ ( 5 ) = − 1 , μ ( 6 ) = 1 μ(1)=1,μ(2)=-1,μ(3)=-1,μ(4)=0,μ(5)=-1,μ(6)=1 μ(1)=1,μ(2)=1,μ(3)=1,μ(4)=0,μ(5)=1,μ(6)=1

μ ( 7 ) = − 1 , μ ( 8 ) = 0 , μ ( 9 ) = 0 , μ ( 10 ) = 1 , μ ( 11 ) = − 1 , μ ( 12 ) = 0 μ(7)=-1,μ(8)=0,μ(9)=0,μ(10)=1,μ(11)=-1,μ(12)=0 μ(7)=1,μ(8)=0,μ(9)=0,μ(10)=1,μ(11)=1,μ(12)=0
这个函数其实就是莫比乌斯函数,他有如下的定义
其中μ(d)为莫比乌斯函数,其定义如下
1.若d=1则 μ ( d ) = 1 μ(d)=1 μ(d)=1
2.若 d = p 1 p 2 ⋯ p k d=p_1p_2\cdots p_k d=p1p2pk,其中 p i p_i pi为不同的素数,那么 μ ( d ) = ( − 1 ) k μ(d)=(-1)^k μ(d)=(1)k
3.其他情况下 μ ( d ) = 0 μ(d)=0 μ(d)=0
那么再联系莫比乌斯函数和系数的关系就可以的到 f ( n ) f(n) f(n) F ( n ) F(n) F(n)的关系

f ( n ) = ∑ d ∣ n μ ( d ) F ( n d ) f(n)=\sum_{d|n}\mu(d)F(\frac{n}{d}) f(n)=dnμ(d)F(dn)

这样的转换就叫做莫比乌斯反演,那么如何快速的求得莫比乌斯函数呢
莫比乌斯函数有以下几个性质
一、对于任意正整数n有
∑ d ∣ n μ ( d ) = { 1 ( n = 1 ) 0 ( n > 1 ) \sum _{d|n}\mu(d)=\left\{\begin{matrix} 1 &(n=1) \\ 0 & (n>1) \end{matrix}\right. dnμ(d)={10(n=1)(n>1)
证明:
①当n=1时显然
②当n>1时,可以将n分解即 n = p 1 a 1 p 2 a 2 ⋯ p k a k n=p_1^{a_1}p_2^{a_2}\cdots p_{k}^{a_k} n=p1a1p2a2pkak
n的因子中,μ(d)不为0的只有n的单个素因子的乘积,由于一共只有k个素因子,我们可以选其中的r个相乘得到n的因子,其中r(0<=r<=k),所以因子的莫比乌斯函数和为

∑ d ∣ n μ ( d ) = C k 0 − C k 1 + C k 2 − C k 3 + ⋯ + ( − 1 ) k C k k = ( 1 − 1 ) k = 0 \sum _{d|n}\mu(d)=C_{k}^{0}-C_{k}^1+C_{k}^2-C_{k}^3+\cdots+(-1)^kC_{k}^k=(1-1)^k=0 dnμ(d)=Ck0Ck1+Ck2Ck3++(1)kCkk=(11)k=0
二、莫比乌斯函数是积性函数
设f(n)为一个定义在N+集合上的函数,如果对于任意(x, y)=1有f(xy)= f(x)f(y),则称f(n)为一个积性函数; 若对于任意x和y均有f(xy)= f(x)f(y),则称f(n)为一个完全积性函数
由于莫比乌斯函数是一个积性函数所以我们就可以用线性筛来求得莫比乌斯函数的值了

int vis[N];
int mu[N];
int prime[N];
int cnt;
void Init(){
    memset(vis,0,sizeof(vis));
    mu[1] = 1;
    cnt = 0;
    for(int i=2; i

莫比乌斯函数有两种写法
写法一:约数形式
F ( n ) = ∑ d ∣ n f ( d ) ⇒ f ( n ) = ∑ d ∣ n μ ( d ) F ( n d ) F(n)=\sum_{d|n}f(d)\Rightarrow f(n)=\sum_{d|n}\mu(d)F(\frac{n}{d}) F(n)=dnf(d)f(n)=dnμ(d)F(dn)
d为n的约数,即F(n)为他的约数的f(d)之和则可以得到这样上述的式子
写法二:倍数形式
F ( n ) = ∑ n ∣ d f ( d ) ⇒ f ( n ) = ∑ n ∣ d μ ( d n ) F ( d ) F(n)=\sum_{n|d}f(d)\Rightarrow f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d) F(n)=ndf(d)f(n)=ndμ(nd)F(d)
d为n的倍数,即F(n)为另一个函数f(d)的和,其中d为n的倍数,可反演到上述式子

莫比乌斯反演的应用##

那我们可以用莫比乌斯反演来干什么呢?下面我们来举一个例子
HDU 1695

题意
a < = x < = b , c < = y < = d a<=x<=b,c<=y<=d a<=x<=b,c<=y<=d,中 g c d ( x , y ) = k gcd(x,y)=k gcd(x,y)=k的对数,其中a,c保证为1
思路
那么我们要求解的也就是 1 < = x < = n , 1 < = y < = m , g c d ( x , y ) = = k 1<=x<=n,1<=y<=m,gcd(x,y)==k 1<=x<=n,1<=y<=m,gcd(x,y)==k的对数
我们可以转换一下问题,即求解的是 1 < = x < = n k , 1 < = y < = m k , g c d ( x , y ) = = 1 1<=x<=\frac{n}{k},1<=y<=\frac{m}{k},gcd(x,y)==1 1<=x<=kn,1<=y<=kmgcd(x,y)==1的对数
n = n k n=\frac{n}{k} n=kn, m = m k m=\frac{m}{k} m=km
我们设
f ( d ) f(d) f(d) g c d ( x , y ) = = d gcd(x,y)==d gcd(x,y)==d且, 1 < = x < = n , 1 < = y < = m 1<=x<=n,1<=y<=m 1<=x<=n,1<=y<=m的对数
F ( d ) F(d) F(d) g c d ( x , y ) gcd(x,y) gcd(x,y) d d d的倍数的,且 1 < = x < = n , 1 < = y < = m 1<=x<=n,1<=y<=m 1<=x<=n,1<=y<=m的对数,即 d ∣ g c d ( x , y ) d|gcd(x,y) dgcd(x,y)的对数

那么很显然的是 F ( d ) = n d ⋅ m d F(d)=\frac{n}{d}\cdot \frac{m}{d} F(d)=dndm,那么也就有 F ( i ) = ∑ i ∣ d f ( d ) F(i)=\sum_{i|d}f(d) F(i)=idf(d),例如要求的是F(2),那么F(2)为f(d)的和,其中d为2的倍数

那么我们通过反演可以得到 f ( i ) = ∑ i ∣ d μ ( d i ) F ( d ) f(i)=\sum_{i|d}\mu(\frac{d}{i})F(d) f(i)=idμ(id)F(d)
有了上述式子我们实际上要求的是就是
f ( 1 ) = ∑ 1 ∣ d μ ( d 1 ) F ( d ) = ∑ d = 1 m i n ( n , m ) μ ( d ) ( n d ) ( m d ) f(1)=\sum_{1|d}\mu(\frac{d}{1})F(d)=\sum_{d=1}^{min(n,m)}\mu(d)(\frac{n}{d})(\frac{m}{d}) f(1)=1dμ(1d)F(d)=d=1min(n,m)μ(d)(dn)(dm)
我们只要从让d从1枚举到min(n,m)即可剩下重复的部分容斥以下就好了

long long a,b,c,d,k;
        scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&k);
        if(k==0)
        {
            printf("Case %d: 0\n",cas++);
            continue;
        }
        b=b/k;
        d=d/k;
        long long ans1=0,ans2=0;
        for(int i=1; i<=min(b,d); i++)
            ans1+=mu[i]*(b/i)*(d/i);
        for(int i=1; i<=min(b,d); i++)//容斥的部分
            ans2+=mu[i]*(min(b,d)/i)*(min(b,d)/i);
        ans1-=ans2/2;
        printf("Case %d: %lld\n",cas++,ans1);

莫比乌斯反演的优化##

我们在求解莫比乌斯反演的时候常常要用到 ⌊ n d ⌋ \left \lfloor \frac{n}{d} \right \rfloor dn,实际上我们可以对这个进行优化, ⌊ n d ⌋ \left \lfloor \frac{n}{d} \right \rfloor dn的取值实际上只会有 2 n 2\sqrt{n} 2n 个不同的取值

$\left\lfloor\frac{n}{i}\right\rfloor 中 的 中的 i 在 一 段 区 间 内 在一段区间内 \left\lfloor\frac{n}{i}\right\rfloor 的 值 都 是 一 样 的 , 所 以 我 们 可 以 把 他 分 成 不 同 的 区 域 例 如 的值都是一样的,所以我们可以把他分成不同的区域 例如 ,n=30$我们可以分成10个不同的区域
[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 , 10 ] [ 11 , 15 ] [ 16 , 30 ] 30 15 10 7 6 5 4 3 2 1 \begin{matrix} [1]&[2]&[3]&[4]&[5]&[6]&[7]&[8,10]&[11,15]&[16,30]\\ 30 &15 & 10 & 7 & 6 &5 & 4 & 3 & 2 &1 \end{matrix} [1]30[2]15[3]10[4]7[5]6[6]5[7]4[8,10]3[11,15]2[16,30]1

观察会发现$\left\lfloor\frac{n}{i}\right\rfloor 对 于 每 一 个 首 项 对于每一个首项 i , 他 的 末 项 就 是 ,他的末项就是 \left\lfloor\frac{n}{\frac{n}{i}}\right\rfloor , 那 也 就 是 说 在 一 个 范 围 内 , 可 以 取 ,那也就是说在一个范围内,可以取 \left\lfloor\frac{n}{i}\right\rfloor 是 固 定 的 , 所 以 可 以 把 是固定的,所以可以把 \left\lfloor\frac{n}{i}\right\rfloor $提出来,优化的话求一个莫比乌斯函数的前缀和就可以了

for(int i=1,last;i<=min(n,m);i=last+1)
{
        last=min(n/(n/i),m/(m/i));
        ans+=(sum[last]-sum[i-1])*(n/i)*(m/i);//sum[i]为莫比乌斯函数的前缀和
}

你可能感兴趣的:(莫比乌斯反演)