程序员社区

【组合数学】生成函数 ( 使用生成函数求解多重集 r 组合数 )

文章目录

  • 一、使用生成函数求解多重集 r 组合数
  • 二、使用生成函数求解多重集 r 组合数 示例

参考博客 :

  • 【组合数学】生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 | 与多项式系数相关 )
  • 【组合数学】生成函数 ( 线性性质 | 乘积性质 )
  • 【组合数学】生成函数 ( 移位性质 )
  • 【组合数学】生成函数 ( 求和性质 )
  • 【组合数学】生成函数 ( 换元性质 | 求导性质 | 积分性质 )
  • 【组合数学】生成函数 ( 性质总结 | 重要的生成函数 ) ★
  • 【组合数学】生成函数 ( 生成函数示例 | 给定通项公式求生成函数 | 给定生成函数求通项公式 )
  • 【组合数学】生成函数 ( 生成函数应用场景 | 使用生成函数求解递推方程 )

一、使用生成函数求解多重集 r 组合数


S

=

{

n

1

a

1

,

n

2

a

2

,


,

n

k

a

k

}

S = \{ n_1 \cdot a_1, n_2 \cdot a_2, \cdots, n_k \cdot a_k \}

S={n1a1,n2a2,,nkak} 是多重集 , 其含有

k

k

k 个种类的元素 ,

n

1

,

n

2

,


,

n

k

n_1, n_2, \cdots, n_k

n1,n2,,nk 是每种元素的重复度 ,

多重集的

r

r

r 组合数 , 是 不定方程

x

1

+

x

2

+

+

x

k

=

r

x_1 + x_2 + \cdots + x_k = r

x1+x2++xk=r 的非负整数解 , 前提是

x

i

n

i

x_i \leq n_i

xini , 每个元素所取的个数

x

i

x_i

xi , 不能超过其重复度

n

i

n_i

ni ;

相当于

a

1

a_1

a1

x

1

x_1

x1 个 ,

a

2

a_2

a2

x

2

x_2

x2 个 ,

\cdots

,

a

k

a_k

ak

x

k

x_k

xk 个 , 总共取

r

r

r 个 ;

n

i

n_i

ni 是无穷个数时 , 多重集的

r

r

r 组合数是

C

(

k

+

r

1

,

r

)

C(k + r - 1, r)

C(k+r1,r)

回顾多重集排列组合 :

  • 可重复的元素 , 有序的选取 , 对应 多重集的排列 ;

    =

    n

    !

    n

    1

    !

    n

    2

    !

    n

    k

    !

    全排列 = \cfrac{n!}{n_1! n_2! \cdots n_k!}

    =n1!n2!nk!n! , 非全排列

    k

    r

    ,

      

    r

    n

    i

    k^r , \ \ r\leq n_i

    kr,  rni

  • 可重复的元素 , 无序的选取 , 对应 多重集的组合 ;

    N

    =

    C

    (

    k

    +

    r

    1

    ,

    r

    )

    N= C(k + r - 1, r)

    N=C(k+r1,r)

上述的 多重集

r

r

r 组合数

C

(

k

+

r

1

,

r

)

C(k + r - 1, r)

C(k+r1,r) 是在重复度不受限制的情况下的选取结果 , 如果重复度受限制 , 就需要使用生成函数进行计算 ;

如添加如下限制 :

a

1

a_1

a1 最多能取

3

3

3 ,

a

2

a_2

a2 最少取

4

4

4 个 , 最多取

10

10

10 个 ;

生成函数 :

G

(

y

)

=

G(y) =

G(y)=

(

1

+

y

+

+

y

n

1

)

(1 + y + \cdots + y^{n_1})

(1+y++yn1)

(

1

+

y

+

+

y

n

2

)

(1 + y + \cdots + y^{n_2})

(1+y++yn2)

\cdots

(

1

+

y

+

+

y

n

k

)

(1 + y + \cdots + y^{n_k})

(1+y++ynk)

多重集中的每个元素的取值个数作为

y

y

y 的次幂 , 如

a

1

a_1

a1 元素的取值个数是

0

0

0

n

1

n_1

n1 , 则该项对应的 生成函数项是

y

y

y

0

0

0 次幂 ,

y

y

y

n

1

n_1

n1 次幂 相加 ; 构成项

(

1

+

y

+

+

y

n

1

)

(1 + y + \cdots + y^{n_1})

(1+y++yn1) ;

将所有元素的上述 生成函数项 乘到一起 , 就构成上述生成函数 ;

按照多项式乘法 , 多重集中取

r

r

r 个元素 ,

从第一个因式

(

1

+

y

+

+

y

n

1

)

(1 + y + \cdots + y^{n_1})

(1+y++yn1) 拿出

y

x

1

y^{x_1}

yx1 ,

从第二个因式

(

1

+

y

+

+

y

n

2

)

(1 + y + \cdots + y^{n_2})

(1+y++yn2) 拿出

y

x

2

y^{x_2}

yx2 ,

\vdots

从第

k

k

k 个因式

(

1

+

y

+

+

y

n

k

)

(1 + y + \cdots + y^{n_k})

(1+y++ynk) 拿出

y

x

k

y^{x_k}

yxk ,

如果上述乘积

y

x

1

y

x

2

y

x

k

y^{x_1}y^{x_2}\cdots y^{x_k}

yx1yx2yxk 的结果 是

y

r

y^{r}

yr , 即

y

x

1

y

x

2

y

x

k

=

y

r

y^{x_1}y^{x_2}\cdots y^{x_k} = y^{r}

yx1yx2yxk=yr , 相当于指数

x

1

+

x

2

+

+

x

k

=

r

x_1 + x_2 + \cdots + x_k = r

x1+x2++xk=r , 也就是不定方程的非负整数解 ;

二、使用生成函数求解多重集 r 组合数 示例


多重集

S

=

{

3

a

,

4

b

,

5

c

}

S = \{3\cdot a , 4 \cdot b , 5 \cdot c \}

S={3a,4b,5c} , 求该多重集的

10

10

10 组合数 ;

上述多重集元素的 重复度

3

,

4

,

5

3,4,5

3,4,5 都不超过

10

10

10 ;

对应

a

a

a 元素 , 其 重复度取值范围是

0

0

0 ~

3

3

3 , 对应的生成函数项是

y

0

+

y

1

+

y

2

+

y

3

y^0 +y^1 + y^2 + y^3

y0+y1+y2+y3

对应

b

b

b 元素 , 其 重复度取值范围是

0

0

0 ~

4

4

4 , 对应的生成函数项是

y

0

+

y

1

+

y

2

+

y

3

+

y

4

y^0 +y^1 + y^2 + y^3 + y^4

y0+y1+y2+y3+y4

对应

c

c

c 元素 , 其重 复度取值范围是

0

0

0 ~

5

5

5 , 对应的生成函数项是

y

0

+

y

1

+

y

2

+

y

3

+

y

4

+

y

5

y^0 +y^1 + y^2 + y^3 + y^4 + y^5

y0+y1+y2+y3+y4+y5

将上述项相乘 , 得到完整的生成函数 ;

G

(

x

)

=

(

y

0

+

y

1

+

y

2

+

y

3

)

(

y

0

+

y

1

+

y

2

+

y

3

+

y

4

)

(

y

0

+

y

1

+

y

2

+

y

3

+

y

4

+

y

5

)

G(x) = (y^0 +y^1 + y^2 + y^3)(y^0 +y^1 + y^2 + y^3 + y^4)(y^0 +y^1 + y^2 + y^3 + y^4 + y^5)

G(x)=(y0+y1+y2+y3)(y0+y1+y2+y3+y4)(y0+y1+y2+y3+y4+y5)

          

=

(

1

+

y

1

+

y

2

+

y

3

)

(

1

+

y

1

+

y

2

+

y

3

+

y

4

)

(

1

+

y

1

+

y

2

+

y

3

+

y

4

+

y

5

)

\ \ \ \ \ \ \ \ \ \ =(1 +y^1 + y^2 + y^3)(1 +y^1 + y^2 + y^3 + y^4)(1 +y^1 + y^2 + y^3 + y^4 + y^5)

          =(1+y1+y2+y3)(1+y1+y2+y3+y4)(1+y1+y2+y3+y4+y5)

          

=

(

1

+

2

y

1

+

3

y

2

+

4

y

3

+

4

y

4

+

3

y

5

+

2

y

6

+

y

7

)

(

1

+

y

1

+

y

2

+

y

3

+

y

4

+

y

5

)

\ \ \ \ \ \ \ \ \ \ =(1 +2y^1 + 3y^2 + 4y^3 + 4y^4 + 3y^5 + 2y^6 + y^7 )(1 +y^1 + y^2 + y^3 + y^4 + y^5)

          =(1+2y1+3y2+4y3+4y4+3y5+2y6+y7)(1+y1+y2+y3+y4+y5)

统计上述两项相乘 ,

y

y

y 的次幂值为

10

10

10 的项 :

第一个因式的

3

y

5

3y^5

3y5 与第二个因式的

y

5

y^5

y5 , 相乘为

3

y

10

3y^{10}

3y10

第一个因式的

2

y

6

2y^6

2y6 与第二个因式的

y

4

y^4

y4 , 相乘为

2

y

10

2y^{10}

2y10

第一个因式的

y

7

y^7

y7 与第二个因式的

y

3

y^3

y3 , 相乘为

y

10

y^{10}

y10

y

10

y^{10}

y10 项前的系数是

3

+

2

+

1

=

6

3 + 2+1 = 6

3+2+1=6

因此上述 多重集的

10

10

10 组合 ,选择方案有

6

6

6 种 ;

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 【组合数学】生成函数 ( 使用生成函数求解多重集 r 组合数 )

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区