莫比乌斯函数、二项式、斯特林数以及它们的反演

  • 莫比乌斯反演
    • 引入
    • 定理
      • 另一种莫比乌斯反演
    • 证明
    • 性质
    • 求莫比乌斯函数值
    • 例题及题解
  • 二项式反演
    • 反演公式
    • 例题
      • bzoj3622
      • 涂色问题
        • Description
        • Solution
  • Stirling反演
    • 第一类斯特林数
      • 递推方式
    • 第二类斯特林数
      • 求法
        • 递推
        • 容斥
      • 性质
      • 例题
        • CF 932E
          • Description
          • Solution
        • BZOJ2159
    • 反演公式
      • 例题

莫比乌斯反演

引入

莫比乌斯反演一般都是先定义一个函数 F(n) F ( n ) ,再由 F(n) F ( n ) 定义函数 G(n) G ( n ) G(n)=ΣF(d) G ( n ) = Σ F ( d ) ,其中 d d 被包含于 n n 。我们只知道 G(n) G ( n ) 的值,由 G(n) G ( n ) 反推 F(n) F ( n ) ,这个过程就叫做“反演”。
例: S S X X 是两个集合,先定义 F(S) F ( S ) ,再定义 G(S)=ΣF(X) G ( S ) = Σ F ( X ) ,其中 X X S S 的一个子集。如果已知 G G 的值,便可以通过关于集合包含的公式: F(S)=Σ((1)|S||X|G(X)) F ( S ) = Σ ( ( − 1 ) | S | − | X | ∗ G ( X ) )
而反演的实质就是容斥!

定理

定义F(n)和f(n)是定义在非负整数集合上的两个函数,且满足 F(n)=d|nf(d) F ( n ) = ∑ d | n f ( d ) ,那么 f(n)=d|nμ(d)F(nd) f ( n ) = ∑ d | n μ ( d ) F ( n d )
其中 μ(d) μ ( d ) 的定义如下:

  • d=1 d = 1 ,那么 μ(d)=1 μ ( d ) = 1
  • d=p1×p2×pk d = p 1 × p 2 ⋯ × p k pi p i 为互异素数,那么 μ(d)=(1)k μ ( d ) = ( − 1 ) k
  • 其他情况下 μ(d)=0 μ ( d ) = 0

另一种莫比乌斯反演

F(n)=n|df(d)f(n)=n|dμ(dn)F(d) F ( n ) = ∑ n | d f ( d ) ⇒ f ( n ) = ∑ n | d μ ( d n ) F ( d )


证明

d|nμ(d)F(nd)=d|nμ(d)dndf(d)=d|nf(d)d|ndμ(d)=f(n) ∑ d | n μ ( d ) F ( n d ) = ∑ d | n μ ( d ) ∑ d ′ n d f ( d ′ ) = ∑ d ′ | n f ( d ′ ) ∑ d | n d ′ μ ( d ) = f ( n )

Q.E.D.!

性质

1.

d|nμ(d)={10,n=1,n>1 ∑ d | n μ ( d ) = { 1 , n = 1 0 , n > 1

2.
d|nμ(d)d=φ(n)n ∑ d | n μ ( d ) d = φ ( n ) n

求莫比乌斯函数值

套线性筛的板子

void Get_mu(int n)
{
    Set(flag , 0);
    flag[0] = flag[1] = 1;
    cnt = 0;
    mu[1] = 1;
    For(i , 2 , n)
    {
        if (!flag[i])
        {
            prime[++ cnt] = i;
            mu[i] = -1;
        }
        for (int j = 1 ; j <= cnt && i * prime[j] <= n ; ++ j)
        {
            flag[i * prime[j]] = 1;
            if (!(i % prime[j]))
            {
                mu[i * prime[j]] = 0;
                break;
            }
            mu[i * prime[j]] = - mu[i];
        }
    }
    For(i , 1 , n)
        printf("%d\n" , mu[i]);
}

例题及题解

BZOJ1101
BZOJ3994
BZOJ3930
BZOJ3201
BZOJ2005
HDU1695


二项式反演

反演公式

f(n)=k=pn(nk)g(k) f ( n ) = ∑ k = p n ( n k ) g ( k )


g(n)=k=pn(1)nk(nk)f(k) g ( n ) = ∑ k = p n ( − 1 ) n − k ( n k ) f ( k )

例题

bzoj3622

题解

涂色问题

Description

有个 1×n 1 × n 的格子, m m 种颜色( m2 m ≥ 2 ),要求相邻格子的颜色不相同且每种颜色都要用到,求染色方案数。

Solution

f(n) f ( n ) 为恰好用了 n n 种颜色的方案数, g(n) g ( n ) 为至多用了 n n 种颜色的方案数。
那么有:

g(k)=k(k1)n1=i=2k(ki)f(i) g ( k ) = k ( k − 1 ) n − 1 = ∑ i = 2 k ( k i ) f ( i )

由二项式反演得:
f(k)=i=2k(1)ki(ki)g(i) f ( k ) = ∑ i = 2 k ( − 1 ) k − i ( k i ) g ( i )


Stirling反演

第一类斯特林数

[nm] [ n m ] 表示将 n n 个元素排成 k k 个轮换的方法数。

递推方式

[nm]=[n1m1]+(n1)[n1m] [ n m ] = [ n − 1 m − 1 ] + ( n − 1 ) [ n − 1 m ]

第二类斯特林数

gzy’s blog
{nm} { n m } 表示将 n n 个元素划分成 k k 个非空子集的方法数。

求法

递推

{nm}={n1m1}+m{n1m} { n m } = { n − 1 m − 1 } + m { n − 1 m }

容斥

{nm}=1m!k=0m(1)k(mk)(mk)n { n m } = 1 m ! ∑ k = 0 m ( − 1 ) k ( m k ) ( m − k ) n

理解:枚举盒子的个数,其他的随便乱放,由于盒子视作相同,所以除以 m! m !

整理该式得:

{nm}=k=0m(1)k×1k!×(mk)n(mk)! { n m } = ∑ k = 0 m ( − 1 ) k × 1 k ! × ( m − k ) n ( m − k ) !

发现是卷积的形式,可以用NTT在 O(nlog2n) O ( n log 2 ⁡ n ) 的时间内求解。

性质

nk=i=0k{ki}(ni)i! n k = ∑ i = 0 k { k i } ( n i ) i !

理解:左边是将 k k 个球放在 n n 个盒子里;右边枚举非空盒子的个数,从 n n 个盒子中选出 i i 个盒子,将 k k 个球放在这 i i 个盒子里,由于盒子是不同的,所以乘上 i! i !
这个式子还可以转化为:
nk=i=1k{ki}ni n k = ∑ i = 1 k { k i } n i _

例题

CF 932E

参考肖dalao博客

Description

i=1n(ni)×ik ∑ i = 1 n ( n i ) × i k

Solution

用上面的性质推式子:

i=1n(ni)×ik ∑ i = 1 n ( n i ) × i k

=i=1n(ni)j=1k(ij){kj}×i! = ∑ i = 1 n ( n i ) ∑ j = 1 k ( i j ) { k j } × i !

=i=1nj=1k{kj}(ni)(ij)×j! = ∑ i = 1 n ∑ j = 1 k { k j } ( n i ) ( i j ) × j !

=n!i=1nj=1k{kj}1(ni)!1(ij)! = n ! ∑ i = 1 n ∑ j = 1 k { k j } 1 ( n − i ) ! 1 ( i − j ) !

=n!i=1nj=1k{kj}(njni)1(nj)! = n ! ∑ i = 1 n ∑ j = 1 k { k j } ( n − j n − i ) 1 ( n − j ) !

=n!j=1k{kj}i=1n(njni)1(nj)! = n ! ∑ j = 1 k { k j } ∑ i = 1 n ( n − j n − i ) 1 ( n − j ) !

=n!j=1k{kj}2nj1(nj)! = n ! ∑ j = 1 k { k j } 2 n − j 1 ( n − j ) !

=j=1k{kj}2njnj = ∑ j = 1 k { k j } 2 n − j n j _

BZOJ2159

题解

反演公式

感觉和二项式反演比较像。

f(n)=i=1n{ni}g(i) f ( n ) = ∑ i = 1 n { n i } g ( i )


g(n)=i=1n(1)ni[ni]f(i) g ( n ) = ∑ i = 1 n ( − 1 ) n − i [ n i ] f ( i )

例题

异或图
(其实这个题也只是在推容斥系数时候用了一下233)

你可能感兴趣的:(算法,数学,数论,莫比乌斯反演,二项式反演,斯特林数,斯特林反演)