Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

README

Last updated: Thursday 15 January 2026 @ 23:45:51

Contributors

USTC 课程资源分享在线

原先依托于typst渲染的仓库不再维护,转用在线网站的形式,欢迎提交PR为仓库完善做出贡献!

已收录课程

  • 研究生课程
    • 计算机科学与技术
      • COMP6001P算法设计与分析
      • COMP6002P组合数学
      • COMP6103P高级计算机网络
      • COMP6108P高级数据库系统

提交方式:

CHANGELOG

Last updated: Friday 16 January 2026 @ 16:33:01

Contributors

Roadmap

  • Download page source independently
  • insert header and footer

Changelog

2026-01-15

  • #plugin integrate gitinfo
    show git info
  • #ui add tag style
    enhance tag visibility
  • #ui insert header and footer (as markdown)
    page template config
  • #feat download page source file
    markdown source file without decoration

2026-01-14

  • #ui add progress bar
    reading progress bar at the top
  • #ui add back-to-top button
    button scroll back to the top
  • #ux add image zooming
    click-to-zoom for images

2026-01-13

  • #ui integrate whichlang
    enhance code display
  • #plugin integrate reading-time
    word count
  • #plugin integrate toc
    inline outline

2026-01-12

  • #integration integrate giscus
    github-base comments
  • #plugin integrate katex
    enable latex display

计算机科学与技术

Last updated: Wednesday 14 January 2026 @ 18:52:40

Contributors

目录

COMP6001P算法设计与分析

Last updated: Thursday 15 January 2026 @ 23:45:51

Contributors

分类

分布式算法复习知识点

Last updated: Thursday 15 January 2026 @ 20:46:29

Contributors

转载自 cnblogs/学科笔记/中科大-算法分析与设计-分布式算法复习知识点.md at main · BamLubi/cnblogs 中科大-算法分析与设计-分布式算法复习知识点 - 小陆斑比 - 博客园

一、分布式算法

1.1 导论

并行处理与分布式处理的区别

  • 并行处理目标:使用所有处理器执行一个大任务。
  • 分布式处理具有更高程度的不确定性和行为的独立性,每个处理器都有自己独立的任务。

分布式系统作用

  • 共享资源
  • 改善性能
  • 提高可靠性

模型:

  • 异步共享存储模型:用于紧耦合机器
  • 异步 msg 传递模型:用于松散耦合机器及广域网
  • 同步 msg 传递模型:msg 延迟上界已知,系统执行划分为轮执行,是异步系统的特例

1.2 消息传递中的基本算法

每个处理器可以模型化为一个具有状态集的状态机

初始状态包含一个特殊的初始状态子集,每个inbuf必须为空,outbuf不一定为空。

转换函数:将可访问状态的inbuf转换到outbuf

配置:分布式系统上某点整个算法的全局状态

事件计算事件传递事件

执行:配置和事件交错的序列。

需满足安全性条件和活跃性条件。

  1. 安全性:某个性质在每次执行的每个可达配置里都成立。“坏事从不发生”

  2. 活跃性:某个性质在每次执行的某些可达配置里成立。“最终某个好事发生”

满足安全性条件称为执行。同时满足活跃性条件称为容许执行

1.2.1 转移系统与安全性和活跃性

转移系统是配置集,是初始配置的一个子集,是配置集上的二元转移关系。

可达

安全性

,即如果 P 在转移前成立,则 Q 在转移后成立

定义:,P 为安全性条件

定理:如果 P 是 S 的不变式,那么对 S 的每次执行的每一配置 P 都成立

活跃性:在算法的每次执行的某些配置中,P 为真,且最终 P 为真。

判断方法:

  • 范函数
  • 无死锁 / 系统正常终止

范函数

良基集

1.2.2 系统

异步系统

异步msg 传递时间和一个处理器的两个相继步骤之间的时间无上界

执行片段:一个有限或无限的序列,由配置事件交替组成

执行:从初始配置开始的执行片段

调度执行中的事件序列

容许执行:某个处理器有无限个计算事件(指处理器没有出错,并不是无限步),每个发送的 msg 都最终被传递。

同步系统

处理器按轮执行,一轮里,每个处理器可以发送一个 msg 到邻居,每个处理器一接受到 msg 就计算。

:配置和事件序列可以划分为不相交的轮,每轮由一个传递事件一个计算事件组成。

同步系统与异步系统的区别:

  1. 无错的同步系统中,算法的执行只取决于初始配置
  2. 异步系统中,算法可能有不同的执行(不代表不同的结果)

1.2.3 复杂性度量

消息复杂度:所有容许执行上发送消息总数的最大值

时间复杂度

  • 同步系统:最大轮数
  • 异步系统:所有计时容许执行中直到终止的最大时间

1.2.4 生成树上的广播和敛播

生成树 ST:具有共同顶点不出现回路的子图。

最小生成树 MST:所有边权值和最小的生成树。

广播

基本步骤

  1. 发送给所有的孩子。
  2. 某节点收到父节点的时,发送给自己的所有孩子。
upon receiving no msg:
 if i=r then
        send <M> to all children;
  terminates;
upon receiving <M> from P_j:
 send <M> to all children;
 terminates;

消息复杂度

时间复杂度

敛播

基本步骤

  1. 每个叶子节点发送消息给双亲
  2. 每个非叶节点等待所有孩子的消息,之后再发消息给双亲

消息复杂度

时间复杂度

1.2.5 构造生成树

Flooding 算法

消息复杂度:

事件复杂度:

基本思想

  1. 根节点发送消息给所有邻居

  2. 收到来自的消息且是第一次收到消息时,发送向其他向自己发送消息的节点发送以外的邻居发送消息

  3. 收到消息,则表明

Code for Pi (0<=i<=n-1)
初值:parent=nil;集合children和other均为空集

upon receiving no message:
    if i=r and parent=nil then { //根尚未发送M
     send M to all neighbors;
     parent:=i;} //根的双亲置为自己
upon receiving M from neighbor pj:
    if parent=nil then { //pi此前未收到过M,M是pi收到的第1个msg
     parent:=j;
     send <parent> to pj; //pj是pi的双亲
     send M to all neighbors except pj;
    }else //pj不可能是pi的双亲,pi收到的M不是第1个msg
     send <reject> to pj;
upon receiving <parent> from neighbor pj:
    children:=children∪{ j }; //pj是pi的孩子,将j加入孩子集
    if children∪other包含了除parent外的所有邻居 then terminate;
upon receiving <reject> from neighbor pj:
    other:=other∪{ j }; //将j加入other,通过非树边发送的msg。
    if children∪other包含了除parent外的所有邻居 then terminate

异步模型中,构造以为根的生成树

同步模型中,构造的一定是BFS

在异步系统中无法生成 BFS,因为消息传递无上界,最坏可能出现单链。

1.2.6 指定根构造 DFS 生成树

基本思想

  1. 选定根节点,向某一邻接节点发送消息
  2. 收到的消息是第一个来自邻接节点的消息时,认定为其双亲,并向之后给自己发消息的节点发送
  3. 向未发过消息的邻居中任选一个发送消息,并等待回复
  4. 向所有邻居发过消息,则终止
Code for Pi (0<=i<=n-1)
初值:
parent = nil;
children = Φ;
unexplored = Pi's neighbors

upon receiving no message:
 if i=r and parent=nil then { //当Pi为根且未发送M
     parent:=i; // 将parent设置为自身
      任意 Pj ∈ unexplored
       将 Pj 从 unexplored 中删去
     send M to Pj;}//endif
upon receiving M from neighbor Pj:
    if parent=nil then { //pi此前未收到过M
     parent:=j;
        将 Pj 从 unexplored 中删去
        if unexplored!=Φ then {
           任意 Pk ∈ unexplored
       将 Pk 从 unexplored 中删去
     send M to Pk;
        }else send <parent> to parent;
    }else send <reject> to pj; //当Pj已访问过
upon receiving <parent> or <reject> from neighbor pj:
    if received <parent> then add j to children; // Pj是Pi的孩子
    if unexplored = Φ then { //Pi的邻居均已访问
     if parent!=i then send <parent> to parent; //Pi非根,返回至双亲
      terminate; //以Pi为根的DFS子树已构造好
    }else{ //选择Pi未访问过的邻居访问
     任意 Pk ∈ unexplored
       将 Pk 从 unexplored 中删去
     send M to Pk;
    }

消息复杂度,时间复杂度:

1.2.7 不指定根构造 DFS 生成树

与领导者选举问题类似,为破对称问题

基本思想

  1. 每个结点均可自发唤醒,试图构造一根以自己为根的 DFS 生成树。若两棵 DFS 树试图链接同一节点(未必同时),选择根 ID 较大的 DFS 树加入

  2. 每个结点设置一个 leader 变量,即为当前 DFS 树的根 ID

  3. 结点自发唤醒时,将自己的 leader 发送给某一邻居

Code for Pi (0<=i<=n-1)
初值:
parent = nil;
leader = 0;
children = Φ;
unexplored = Pi's neighbors

upon receiving no message: // 自主唤醒
    if parent=nil then { //若非空,则Pi在某子树上,则Pi失去竞选机会
     leader:=id; parent:=i; // 将parent设置为自身
      任意 Pj ∈ unexplored
       将 Pj 从 unexplored 中删去
     send <leader> to Pj;}//endif
upon receiving <new_id> from neighbor Pj:
    if leader<new_id then { //将Pi所在树合并到Pj所在树中
     leader:=new_id; parent:=j;
      unexplored:=all neighbors of Pi except Pj; //重置未访问邻居集
       if unexplored!=Φ then { //原Pi所在DFS树修改各自id
            任意 Pk ∈ unexplored
             将 Pk 从 unexplored 中删去
      send <leader> to Pk;
       }else send <parent> to parent;
    }else if leader=new_id then send <already> to Pj;
upon receiving <parent> or <already> from neighbor pj:
    if received <parent> then add j to children;
    if unexplored = Φ then { //Pi的邻居均已访问
     if parent!=i then send <parent> to parent; //Pi非根,返回至双亲
      else terminate as root of the DFS tree; //以Pi为根的DFS子树已构造好
    }else{ //选择Pi未访问过的邻居访问
     任意 Pk ∈ unexplored
       将 Pk 从 unexplored 中删去
     send <leader> to Pk;
    }

一个具有 m 条边,n 个节点的网络,自发启动的节点由 p 个,ID 值最大的启动时间为 t。

消息复杂度:

时间复杂度:

1.3 环上选举算法

匿名的:环中处理器没有唯一的标识符,每个处理器具有相同的状态机

一致性、均匀的:不知道处理器的数目

解释一致性和非一致性:

算法一:向右转发 n 步 msg,然后终止。 => non_uniform

算法二:向右转发 msg,直到 msg 发送者收到 msg。 => uniform

在一个匿名的、一致性算法中,所有处理器只有一个状态机。

在一个匿名的、非一致性算法中,每个 n 值对应一种状态机。

  • 同步环系统不存在匿名的、一致性的领导者选举算法
  • 异步环系统不存在匿名的领导者选举算法

1.3.1 异步环

开调度:在算法 A 的一次调度中,有一条边上无消息传递,则为开边。

(开调度未必是容许的调度,是容许执行的一个有限前缀)

异步环上的选举算法有消息复杂度下界

基本思想

  1. 每个处理器发送一个标识符 msg 给左邻居,然后等着接收右邻居的 msg。
  2. 每个处理器收到 msg 时,若收到的 id 大于自身,则向左邻居转发。
  3. 若处理器收到自己的标识符 id,则宣布自己是 leader,并发终止 msg 给左邻居,然后终止
  4. 若处理器收到终止 msg,则向左转发,然后终止

核心思想:处理器向左邻居发送标识符 msg,通过比对 id 确定 leader,只有最大的 id 消息会回到他自己。

Code for Pi (0<=i<=n-1)
初值:asleep=true; id = i;

While (receiving no message) do
  (1) if asleep do
      (1.1) asleep = false
      (1.2) send <id> to left-negihbor
   end if
End while
While (receiving <i> from right-neighbor) do
 (1) if id < <i> then send <i> to left-neighbor
       end if
 (2) if id = <i> then
      (2.1) send <Leader,i> to left-neighbor
      (2.2) terminates as Leader
   end if
End while
While (receiving <Leader,j> from right-neighbor) do
 (1) send <Leader,j> to left-neighbor
 (2) terminates as non-Leader
End while

消息复杂度:

的算法

k 邻居:据某一处理器距离不超过 k 的处理器,左边有 k 个,右边有 k 个,共有个。

基本思想

  1. 阶段 0:每个节点向两个 1-邻居发送 id 消息,若邻居的 id 小于此消息则回复 reply,否则吞没。若一个节点收到两个邻居的 reply,则自认为 leader,并进入阶段 1。
  2. 阶段:在上一阶段成为 leader 的处理器,继续发送 id 消息给邻居,若收到来自左右两个方向的 reply,则自认为 leader。
  3. 若收到自己的消息,则终止。

核心思想:第阶段一个处理器试图成为其**-邻居**的临时 leader。只有在阶段成为 leader 的处理器才能继续阶段。

Code for Pi (0<=i<=n-1)
初值:asleep=true;

upon receiving no msg:
      if  asleep then{
       asleep:=false;//每个结点唤醒后不再进入此代码
        send <probe,id, 0, 0> to left and right;
      }
upon receiving <probe, j, l,d> from left_or_right (resp, right):
    if(j=id) then //收到自己id终止,省略发终止msg
       send <leader,id> to left neighbour;
        terminate as the leader;
    if(j>id) and (d<2^l) then //向前转发probe msg
     send <probe, j, l, d+1> to right_or_left (resp, left)
    if(j>id) and (d≥2^l) then //到达最后一个邻居仍未没收
     send <reply, j, l > to left_or_right (resp, right) // 回答
    // 若j<id, 则没收probe消息
upon receiving <reply ,j , l> from left (resp, right):
    if j≠id then // 判断是否转发到初始点
     send <reply, j, l> to right (resp, left); //转发reply
    else //j=id时,Pi已收到一个方向的回答msg
     if already received <reply, j, l> from right (resp, left) then //也收到另一方向发回的reply
    send <probe, id, l+1, 0> to left and right; //Pi是phase l的临时leader,继续下一阶段
upon receiving <leader, idj> from right:
    send <leader, idj> to left;
    terminate as nonleader;

阶段,临时 leader 树最多为,启动的 msg 数目最多为

消息复杂度:

1.3.2 同步环

消息复杂度上界,下界

上界

  • 非均匀:要求环中所有节点开始于同一轮
  • 均匀:节点可以开始于不同轮

证明上界的非均匀算法

必须知道环大小 n,所有节点开始于同一轮

假定 id 最小的为 leader

基本思想:按阶段运行,每个阶段由 n 轮组成。阶段中,处理器 id 也为的选举为 leader,然后终止算法。

各节点互不知道彼此的 id 值。

消息复杂度:恰有 n 个消息被发送,

证明上界的均匀算法

无需知道环大小

一个处理可以:自发唤醒或被动唤醒

基本思想

  1. 源于节点的 msg,在被转发前延迟轮。
  2. 每个自发唤醒的节点绕环发送一个唤醒 msg,且无延迟
  3. 若节点在启动前收到唤醒 msg,则该节点只作转发操作。

只有自发唤醒的节点,才有可能选为 leader

初值:asleep=true;waiting = ф;R = 计算事件中接收msg的集合;s = ф;//the msg to be sent

if asleep then {
    asleep:=false;
    if R = Φ then { // pi未收到过msg,属于自发唤醒
        min:=id;   // 参与选举
        s:=s+{<id>}; // 准备发送
    }else{ //已收到过msg,但此前未启动,被唤醒故Pi不参与
     min:=∞; //选举,置min为∞ ,使其变为relay结点
     // relay:=true; ?
    }
}
for each <m> in R do {// 处理完收到的m后相当于从R中删去
    if m < min then { // 收到的id较小时通过
     become not elected;  // Pi未被选中
     // 可用relay控制使转发节点不延迟?
     将<m>加入waiting且记住m何时加入; // m加入延迟转发
     min:=m;
    } // if m > min then it is swallowed
    if m=id then become elected; // Pi被选中
} //endfor
for each <m> in waiting do
    if <m> 是在2^m-1轮之前接收的 then
     将<m>从waiting中删去并加入S
send S to left;

发送的消息:

  • 第一类:第一阶段的 msg(唤醒 msg
  • 第二类:最终 leader 的 msg 进入自己的第二阶段之前发送的第二阶段 msg(其他节点发的)
  • 第三类:最终 leader 的 msg 进入自己的第二阶段之后发送的第二阶段 msg(包括 leader 发的)

第一类总数最多

第二类总数最多

第三类总数最多

消息复杂度:

有限制的下界

序等价:两个环

若一算法只与环上标识符之间的相对次序相关,而与具体 id 无关,则该算法一定只是基于标识符的比较

对于每个,存在大小为 n 的环,使得基于比较的同步 leader 选举算法 A,在容许执行里发送的 msg 数目为

构造

  1. 定义大小为 n 的环,令的 id 为
  2. 将环划分为长度为的连续片段,则这些片段是序等价的。
  3. 片断数为

1.4 计算模型

计算模型的复杂性:

  • 系统由并发部件构成
  • 无全局时钟
  • 必须捕捉部件可能的失效

对策:

  • 因果关系
  • 一致状态
  • 全局状态

为什么分布式系统缺乏全局系统状态

  1. 非即时通信(传播延时,资源竞争,丢失 msg 重发)

  2. 相对性影响(大多数计算机的实际时钟存在漂移,时钟同步依旧是一个问题

  3. 中断(不可能在同一时刻观察一个分布式系统的全局状态)

次序

定序

  • 发生在同一节点上的事件满足全序,
  • 发送消息,接收消息,则

Happens-before 关系,一种偏序关系

并发事件:两个事件不能由 定序

有时将 Happens-before 关系描述为一个有向无环图

image-20220103152117876

如何将 H 关系的偏序关系转变成全序关系:

  • 在有向无环图 DAG 上的拓扑排序
  • Lamport 算法

1.4.1 Lamport 时间戳

基本思想

  • 事件 e有附加时间戳:e.TS
  • 节点有局部时间戳:my_TS
  • msg有附加时间戳:m.TS
  • 节点执行事件时,将自己的时间戳赋给该事件。
  • 节点发送 msg时,将自己的时间戳给所有的 msg。
  • 接收消息时,本地时间戳更新为最大值
  • 发送消息时,使用本地时间戳打标签
Initially: my_TS = 0;
On event e:
    if(e == 接收消息m) then
     my_TS = max(m.TS, my_TS)); // 取msg时间戳和节点时间戳较大值
     my_TS++;
     e.TS = my_TS; // 给事件e打时间戳
     if(e == 发送消息m) then
      m.TS = my_TS; // 给消息打时间戳

每一时间的时间戳大于前驱时间的时间戳

问题:不同的时间可能有相同的时间戳(并发事件)

改进算法:使用节点地址作为时间戳低位,如。标号后按字典序得到全序关系。

问题:无法通过时间戳判定两个事件是否有因果关系

1.4.2 向量时间戳

向量时间戳 VT

基本思想

  • 节点有局部向量时间戳:my_VT

  • 事件 e 有向量时间戳:e.VT

  • msg 有向量时间戳:m.VT

Initially: my_VT=[0,0,,,0];
On event e:
    if(e == 接收消息m) then
  for i= 1 to M do // 向量时间戳的每个分量只增不减
      my_VT[i] = max(m.VT[i], my_VT[i]);
    my_VT[self]++; // self是本节点的名字
    e.VT = my_VT; // 给事件e打时间戳
    if(e == 发送消息m) then
     m.VT = my_VT; // 给消息m打时间戳

向量时间戳比较:

e1.VT = (5,4,1,3)
e2.VT = (3,6,4,2)
e3.VT = (0,0,1,3)
  1. e1 和 e2 之间没有完全大于或完全小于的关系,则 e1 和 e2 是并发的。

  2. e3 在因果序上先于 e1

1.4.3 因果通信

处理器不能选择 msg 到达的时间,但是可以抑制过早到达的 msg。

如 TCP 中的 FIFO 通信。

基本思想

  • 抑制从 P 发送的消息,知道可以断定没有其他消息早于 m 发生
  • 在每个节点上:
Causal Msg Delivery
Definition:
    时间戳lk:
     使用Lamport时间戳,lk=1;
      使用向量时间戳,lk=(0,,,0,1,0,,,0),第k位为1;
Initially:
    earliest[k] = lk,k=1,,,M // 不同节点当前能传递的消息时间戳的下界
    blocked[k] = {},k=1,,,M // 阻塞队列置空

On the receipt of msg <m> from node P:
    delivery_list = {}
    if (blocked[p]==空) then
     earliest[p] = m.timestamp;
      blocked[p].push_back(m); // 处理收到的消息
    //处理阻塞队列
    while(∃k使blocked[k]非空 &&
     对i=1,,,M(除k和self外) not_earliest(earliest[i],earliest[k],i) )
      // 没有消息比k更早到
    {
     将blocked[k]队头元素m’出队,且加入到delivery_list;
     if (blocked[k]!=空) then
      earliest[k] = m’.timestamp;
     else
       increment earliest[k] by lk
    }
    deliver the msgs in delivery_list; // 按因果序

可能发生死锁(一节点上时间不发送你要的 msg)

该因果通信算法常用于组播

概率算法复习知识点

Last updated: Thursday 15 January 2026 @ 20:46:29

Contributors

转载自 cnblogs/学科笔记/中科大-算法分析与设计-概率算法复习知识点.md at main · BamLubi/cnblogs 中科大-算法分析与设计-概率算法复习知识点 - 小陆斑比 - 博客园

二、概率算法

概率算法分类

  • 数字算法:求近似解
  • Monte Carlo 算法:解判定问题或只有一个正确解的问题。答案未必正确。
  • Las Vegas 算法:决不返回错误答案。
  • Sherwood 算法:总是给出正确答案。

2.1 数字算法

找到数字问题的近似解

值计算:投飞镖模拟,单位圆和外切正方形。

Darts(n){
    k=0;
    for i=1 to n do {
        x = uniform(0,1); y = uniform(0,1);
        if(x*x+y*y<=1) then k++;
    }
    return 4k/n;
}

数字积分:Monte Carlo 积分,但不是本课中的 MC 算法。

计算积分

HitorMiss 算法:单位面积正方形投飞镖,落入积分函数下方的为 k,

HitorMiss(f, n){
    k=0;
    for i=1 to n do {
        x = uniform(0,1); y = uniform(0,1);
        if(y<=f(x)) then k++;
    }
    return k/n;
}

Crude 算法:积分区间上随机取点,取算术平均值乘区间宽度。

Crude(f,n,a,b){
    sum = 0;
    for i=1 to n do{
        x = uniform(a,b);
        sum = sum + f(x);
    }
    return (b-a)*sum/n;
}

相对而言,Crude 算法方差更小,但是 HitorMiss 算法在相同时间迭代次数更多

解题思路:

Trapezoid 确定性算法:梯形算法,将区间划分为 n-1 个子区间

Trapezoid(f,n,a,b){
    // 假设n>=2
    delta = (b-a)/(n-1);
    sum = (f(a)+f(b))/2;
    for(x=a+delta; x<=b-delta; x+=delta){
        sum = sum + f(x);
    }
    return sum * delta;
}

确定性算法有时求不出解,概率算法适用于高维定积分。

概率计数:估计整数值,如集合的大小或者集合中不同对象数目的估计。

求集合的大小:有放回的随机抽取元素,k 是第 1 次出现重复元素之前所选出的数目。

SetCount(X){
    k = 0; S = {}; a = uniform(X);
    do{
        k++;
        S = S U {a};
        a = uniform(X);
    }while(a不属于S)
    return 2k**2/pi
}

多重集合不同对象数目估计:将单词映射到长度为 m 的位串,

WordCount(){
    y[1...m+1] = 0;
    for 磁带上的每个单词 x do {
        i = pi(h(x), 1); // x的散列值中等于1的最小位置,表示x是以 00...01....开头的
        y[i] = 1;
    }
    return pi(y, 0); // 返回y中等于0的最小位置
}
2^(k-2)<=n<=2^k,更准确的n=2^k/1.54703

2.2 Sherwood 算法

总是给出正确的答案,平滑不同输入实例的执行时间

用途:平均性能较优,但是最坏性能较差时才使用。比如选择和排序,对元素的相对顺序敏感。

基本过程

  1. 将被解实例变换到一个随机实例。(预处理)
  2. 用确定算法解随机实例,得到一个
  3. 将此解变换为原实例的解。(后处理)
RH(x){
    // 用Sherwood算法计算f(x)
    n = length(x); // x的size为n
    r = uniform(A[n]); // 随机选取一个元素
    y = u(x,r); // 将原实例x转化为随机实例y
    s = f(y); // 用确定算法求y的解s
    return v(r,s); // 将s的解还原为x的解
}

选择和排序的 Sherwood 算法:将输入实例打乱,无需后处理。在调用确定性算法前,先洗牌

Shuffle(T){
    n = length(T);
    for i=1 to n-1 do {
        // 在T[1...n]中随机选取一个元素放在T[i]上
        j = uniform(1...n);
        sqap(T[i],T[j]);
    }
}

离散对数计算:

简单算法

  1. 计算,x 有限个取值,因为离散对数是个循环群
  2. 验证是否成立
dlog(g,a,p){ // 当这样的算法不存在时,算法返回p
    x = 0; y = 1;
    do{
        x++;
        y = y*g; // 计算y=g**x
    }while(a!=y%p && x!=p);
    return x;
}

定理:

Sherwood 改造算法

dlogRH(g, a, p){
    r = uniform(0..p-2);
    b = g^r mod p; // 求幂模b=g**r%p
    c = ba mod p; // 定理1
    y = dlog(g,c,p); // 使用确定性算法求log_{g,p}c, y=r+x
    return (y-r) mod (p-1); // 求x
}

搜索有序表:数值数组和指针数组构成有序的静态链表

时间为的确定算法:直接顺序搜索,平均时间

Search(x, i){
    while x > val[i] do
     i = ptr[i];
     return i;
}
A(x){
    return Search(x, head);
}

时间为的概率算法:从随机的一个点左右开始顺序搜索,平均时间

D(x){
    i = uniform(1..n);
    y = val[i];
    case{
        x<y: return Search(x, head);   // 从头开始搜索
        x>y: return Search(x, ptr[i]); // 从下一个位置开始搜索
        otherwise: return i; // case3 x==y
    }
}

平均时间为的确定算法:在前个数中找不大于 x 的最大整数的下标,从该数开始向后查找。

B(x){ // 设x在val[1..n]中
    i = head;
    max = val[i]; // max初值是表val中的最小值
    for j=1 to [sqrt(n)] do { // 在前根号n个数中找不大于x的最大整数y的下标
        y = val[j];
        if max < y <= x then {
            i = y; max = y;
        }
    }
    return Search(x, i);
}

2.3 Las Vegas 算法

特点:

  • 更有效率的算法
  • 时间上界可能不存在
  • 可能找不到解,但如果找到一定是正确的
  • 成功的概率随执行时间的增加而增加

算法的一般形式

约定记号:

一般会多次运行 LV 算法,知道成功

Obstinate(x){
    repeat
     LV(x,y,success);
    until success;
    return y;
}

找到正确解的期望时间:

2.3.1 八皇后问题

要求:

  • 行不冲突:行号相等
  • 列不冲突:列号相等
  • 主对角线不冲突:行列号之差相等
  • 辅对角线不冲突:行列号之和相等

传统回溯法:分别决定每一行放在哪个位置

i = j = 1;
while i ≤ 8 do { // 当前行号i≤ 8
    检查当前行i:从当前列j起向后逐列试探,寻找安全列号;
    if 找到安全列号 then {
        放置皇后,将列号记入栈,并将下一行置为当前行(i++);
        j=1; //当前列置为1
    } else {
        退栈回溯到上一行,即i--;
        移去该行已放置的皇后,以该皇后所在列的下一列作为当前列;
    }
}

Las Vegas 算法

约定:

  • ,当且仅当满足 k 皇后要求

基本步骤

  1. 遍历改行所有的列位置是否可行,概率下选用该列
  2. 如果有解则放,没解则退出
QueensLV(success){
    // 贪心的LV算法,所有皇后都是随机放置
    col, diag45, diag135 = {}; // 列、两个对角线初始化为空集
    k = 0; // 行号
    repeat
        nb = 0; // 计数器,nb值为(k+1)th皇后的open位置总数
     // 遍历列号,试探(k+1,i)是否安全
        for i=1 to 8 do {
            if (i!∈col) and (i-k-1!∈diag45) and (i+k+1!∈diag135) then {
                // 列i对(i+1)th皇后可用,但不马上放置
                nb = nb + 1;
                if uniform(1..nb)=1 then // 或许放在第i列
                 j = i;
            }
        }
        if(nb>0) then {
            // nb=0时无安全位置
            // 在所有nb个安全位置上,(k+1)th皇后选择位置j列的概率为1/nb
            k = k+1;
            try[k] = j;
            col = col ∪ {j};
            diag45 = diag45 ∪ {j-k};
            diag135 = diag135 ∪ {j+k};
        }
    until nb=0 or k=8; // 当找不到合适的位置,或者try是8-promising时,退出
    success = (nb>0);
}

算法 12 行,在所有可能的列位置上,选中某一列的概率都是,从最后一项往前倒推。

改进算法:联合回溯法LV 算法,指定使用 LV 算法只确定前几行的位置。

...上述算法...
until nb=0 or k=stepVegas; // 已随机放好stepVegas个皇后
if nb>0 then
    backtrace(k, col, diag45, diag135, success);
else
    success = false;

2.3.2 模 p 平方根

,则

  • x 为模 p 的二次剩余
  • y 为 x 模 p 的平方根

定理:

  • 任何一个模 p 的二次剩余有两个不同的平方根
  • 1 到 p-1 之间的整数恰有一半时模 p 的二次剩余

如何判定x 是否为模 p 的二次剩余?计算是否为 1。

如何计算x 模 p 的两个平方根?

  • ,则平方根为

  • ,只能使用 LV 算法

例子,求 7 模 53 的平方根。

基本步骤

  1. 随机取
  2. 计算 c 和 d,
  3. ,则返回假
  4. ,则找到 y,
rootLV(x, p, y, success){ // 计算y
    a = uniform(1..p-1); // 并不知道a取多少
    if a**2 % p == x % p then { // 可能性很小
        success = true; y =a;
    }else{
        计算c和d,使得0<=c,d<=p-1,(a+sqrt(x))**((p-1)/2) % p == c+d*sqrt(x) % p;
        if d==0 then success = false;
        else{ // c=0
            success = true;
            计算y使得,d*y % p == 1, 1<=y<=p-1 // 修改Euclid算法可求
        }
    }
}

算法成功的概率大于 0.5,因此平均调用两次即可求得 x 的平方根。

2.3.3 整数的因数分解

整数的素因数分解,

朴素 split 算法:找到 n 的一个非平凡因数

split(n){
    // n是素数返回1,否则返回找到的n的最小非平凡因数
    for i=2 to [sqrt(n)] do
        if n % i == 0 then return i;
    return 1;
}

合数的二次剩余:上节的二次剩余要求 p 为奇素数,则恰有两个不同的平方根。若,则二次剩余恰有4 个平方根

Dixon 因数分解算法

基本步骤

  1. 找到与 n 互素的整数 a 和 b,使得
  2. 则 n 和 a+b 的最大公因子是一个非平凡因子,
Dixon(n,x,success){ // 找合数n的某一非平凡因子
    if n是偶数 then {
        x = 2; success = true;
    }else{
        for i=2 to [log_{2}n] do {
            if n**(1/i) 是整数 then {
                x = n**(1/i); success = true; return;
            }
        }
        找到a, b,使得 a**2 % n == b**2 % n;
        if a % n == +-b % n then success = false;
        else {
            x = gcd(a+b, n); // 最大公因子
            success = true;
        }
    }
}

k-平滑:一个整数 x 的所有素因子均在前 k 个素数中。

确定 a 和 b 的取值:提前选定 n 和 k。

  1. 随机选择

    • 若 x 不与 n 互素,则找到了非平凡因子
    • 否则,,若 y 是 k 平滑的,则将 x 和 y 的因数分解保存在表里。
    • 一直重复,直到选择了k+1 个互不相同的整数 x
  2. 在 k+1 个因式分解式中找到一个非空子集,使得相应的因式分解的积中前 k 个素数的指数均为偶数(包含 0),如

  3. ,则只需要求 a+b 和 n 的最大公因子即可。

时间分析:k 的取值将会影响 是 k 平滑的可能性,以及因数分解 y 时的时间。通常取如下时间

2.4 Monte Carlo 算法

存在某些问题无法找到有效的算法获得正确解。MC 以高概率找到正确解。

约定:

  • p-正确:一个 MC 算法以不小于 p 的概率返回一个正确的解
  • 相容的、一致的:一个 MC 算法对同一实例返回相同的正确解

多次调用同一个算法,选择出现次数最多的解,以增加一致的,p-正确算法成功的概率。

有偏算法

  • 偏真算法:MC 算法返回 true 时的解一定正确,只有返回 false 时才有可能产生错误的解。
  • 算法:算法返回时总是正确的,返回非时 p 概率正确。

重复调用一个一致的,p-正确的,偏的 MC 算法 k 次,得到一个 -正确的算法。

2.4.1 主元素问题

一个具有 n 个元素的数组,若某一元素的个数大于,则其为主元素。

判断 T 是否有主元素:随机设置一个 x,然后看看有多少个

maj(T){
    i = uniform(1..n);
    x = T[i];
    k = 0;
    for j=1 to n do
        if T[j] == x then
            k = k+1;
    return k>n/2;
}
偏真,0.5-正确的算法

重复调用降低错误率

maj2(T){
    if maj(T) then return true; // 1次成功
    else return maj(T); // 调用2次
}
偏真,0.75-正确的算法

算法改进:控制算法出错概率小于,应调用次数为

// e 为错误概率
majMC(T, e){
    k = [lg(1/e)]; // 上取整
    for i=1 to k do
        if maj(T) then return true;
    return false;
}
// O(nlg(1/e))

2.4.2 素数测定

判定一个整数是否为素数,尚未找到有效的确定性算法或 LV 算法

简单的概率算法

prime(n){
    d = uniform(2..[sqrt(n)]); // 下取整
    return (n mod d)!=0;
}

Fermat 小定理

变换命题

素性测定算法:使用 Fermat 小定理,偏假的。即算法返回假,一定为假。

Fermat(n){
    a = uniform(1..n-1);
    if a**(n-1) mod n == 1 then return true; // 未必正确
    else return false; // 一定正确
}

伪素数和素性伪证据:符合 Fermat 小定理的合数,称为以 a 为底的伪素数,a 称为 n 的素性伪证据

将 Fermat 测试重复多次,也不能降低误差

强伪素数:n 是大于 4 的奇数,s 和 t 是整数,使得,集合满足如下条件:

  • n 为素数,则
  • n 为合数,,则称 n 为一个以 a 为底的强伪素数,a 为 n 素性的强伪证据
Btest(a, n){
    // n为奇数,2<=a<=n-2, 返回true则代表a属于B(n)。则n为强伪素数或素数
    s=0; t=n-1; // t开始为偶数
    repeat
        s++;t/=2;
    until t mod 2 = 1; //n-1=(2**s)t, t为奇数
    x = a**t mod n;
    if x=1 or x=n-1 then return true; // 满足条件1或2
    for i=1 to s-1 do{
        x = x**2 mod n;
        if x=n-1 then return true; // 满足条件2
    }
    return false;
}
0.75-正确

强伪证据的数目比伪证据数目很多。

Miller-Rabin 测试:0.75-正确,偏假的

MillRab(n){ // 奇n>4,返回真时表示素数,假时表示合数
    a = uniform(2..n-2);
    return Btest(a,n); // 测试n是否为强伪素数
}

RepeatMillRob:重复实验 k 次,-正确的 MC 算法

RepeatMillRob(n,k){
    for i=1 to k do
        if MillRob(n) == false then return false; // 一定是合数
    return true;
}

若给出出错概率不超过,则重复次数为

确定 n 素性时间为:

2.4.3 矩阵乘法验证

验证

,则问题转化为

基本步骤

  1. 计算
  2. 计算的乘积
  3. 计算
GoodProduct(A,B,C,n){
    for i=1 to n do
        x[i] = uniform(0..1);
    if XAB=XC then return true;
    else return false;
}

偏假的,0.5-正确

返回假一定为假

改进算法:重复 k 次

RepeatGoodProduct(A,B,C,n,k){
    for i=1 to k do // 重复k次
        if GoodProduct(A,B,C,n) == false then return false;
    return true;
}

偏假的,-正确

给出错误概率:即

GP(A,B,C,n,e){
    k = [lg(1/e)]; // 上取整
    return RepeatGoodProduct(A,B,C,n,k);
}
// O(n**2log(1/e))

近似算法复习知识点

Last updated: Thursday 15 January 2026 @ 20:46:29

Contributors

转载自 cnblogs/学科笔记/中科大-算法分析与设计-近似算法复习知识点.md at main · BamLubi/cnblogs 中科大-算法分析与设计-近似算法复习知识点 - 小陆斑比 - 博客园[TOC]

三、近似算法

3.1 NP-完全性理论

图灵机

  • 确定性图灵机 DTM:执行的动作唯一
  • 非确定性图灵机 NTM:执行的动作有多个可选

P 类问题

确定性算法在多项式时间内可解

多项式时间内可解的问题P

NP 类问题

非确定性算法在多项式时间内可解

多项式时间内可验证的问NP

多一规约

多项式时间多一规约是多项式时间可计算的

NPC 问题:对于判定问题 q,满足

NP-hard 问题:对于判定问题 q,满足

解题思路:

  • 证明,找到,再将多项式归约到
  • 如果继续证明,则
  • NPC 问题:SAT 可满足性问题、最大独立集问题、背包问题、覆盖问题、路径问题
  • NPH 问题:停机问题

规约策略

  • 特殊到一般,

3.2 相关问题总结

  1. 独立集问题(Independent-Set):图的顶点集合的子集中,所有顶点两两没有边
  2. 团问题:图的顶点集合的子集中,所有顶点两两均有边
  3. 顶点覆盖问题(Vertex-Cover):图的顶点集合的子集中,边集中至少有一个顶点在该子集中。
  4. 集合覆盖问题(Set-Cover):非空集合的若干非空子集合的并集等于原有集合。
  5. 3-SAT 问题:**3-CNF(合取范式)**组成的布尔公式存在真值解。
  6. 哈密尔顿圈问题:图中通过每一个顶点恰好一次的回路。

上述问题均是 NPC 的。

单源最短路径和欧拉环是 P 问题。

3.3 近似算法

三种放宽要求的可能性:

  • 超多项式时间启发:存在一个伪多项式时间的算法,如背包问题。(缺点:只对弱 NPC 问题有效)
  • 概率分析:不再要求问题的解满足所有输入实例。(缺点:选取一个特殊的输入分布不容易)
  • 近似算法:不再要求总是找到最优解。设计一个算法找出所有情况下的次优解来解 NP-hard 问题、

近似解分类

  • 容易近似:背包问题、调度问题、装箱问题
  • 中等难度:顶点覆盖问题、欧式 TSP 问题、Steiner Trees
  • 难于近似:着色问题、TSP、Clique(团)

性能保证:在最优解和近似解之间建立某种联系。

绝对性能度量:绝对近似算法是优化问题的多项式时间近似算法 A,,使得

含义:近似解和最优解相差某一小的常数。

对于大多数的 NPH 问题,不存在绝对近似算法,除非

两种绝对近似算法:

  • 图是否可以 3 着色:

    • G 为二部图,即可 2 着色
    • G 一定可以 4 着色,四色定理
  • 图边着色最小颜色数:

    • 最大度 / 最大度+1

前提已知最优解 或 值所在的小范围

对于大多数 NPH 问题,存在绝对近似算法当且仅当存在多项式精确算法。

反证不存在绝对近似算法

  • 背包问题,通过 Scaling 放大利润为 k+1 倍,再算解的值
  • 最大团问题,构造

相对性能度量:算法 A 在一个输入实例上的性能比为

含义:近似解和最优解比值为某一小的常数。

  • 绝对性能比
  • 渐近性能比
  • 最佳可达性能比

对于有 Scaling 性质的问题,

很多问题找不到绝对近似算法。

有些问题找不到有界性能比近似算法。

3.3.1 多机调度问题

List 调度算法:n 个作业依次分配给当前负载最小的机器。

证明上界:

证明紧确界:有个作业

LPT 调度算法:将作业递序排列,然后 List 策略调度。

3.3.2 装箱问题 BP

n 件物品,每件物品在单位大小之内,按某种策略装入单位大小的箱子中,令箱子数最小。

首次适应算法 FF

证明:

最多只有一个箱子是大于半空的。

物品的总大小至少为总箱子的一半,

最优解至少为物品的总大小,

递减首次适应 FFD

3.3.3 旅行商问题 TSP

求最短哈密顿回路 HC,访问所有顶点一次的回路。

这里研究,即输入满足三角不等式

近邻法 NN:从当前顶点访问最近尚未访问的顶点,一次构造哈密尔顿圈 HC

MST 启发:先找一个欧拉环 ET,然后再”Short-Cut“获得哈密尔顿圈。

有欧拉环,当且仅当图连通且顶点度数均为偶数

MST:

  1. 构造最小生成树
  2. 每条边复制一个
  3. 找到欧拉圈
  4. 短路欧拉路的方法构造 HC,即遇到重复顶点就跳过。

CH 启发:不需要将所有边都复制,只在每对奇度顶点之间连线。

CH:

  1. 构造最小生成树
  2. 每对奇度顶点之间连线
  3. 找到欧拉圈
  4. 短路欧拉路的方法构造 HC,即遇到重复顶点就跳过。

COMP6002P组合数学

Last updated: Thursday 15 January 2026 @ 23:45:51

Contributors

分类

ch02排列与组合

Last updated: Wednesday 14 January 2026 @ 16:54:45

Contributors

转载自liuzengh/combinatorial-mathematics

1. 计算50!的尾部有多少个零?

编程题 Leetcode 172 Factorial Trailing Zeroes

def fun(n):
    if n<5:
        return 0
    return n//5 + fun(n//5)
fun(50)

一种有12个零。 注意到只能由产生0(而如果一个数本身含有0, 一定是能被2和5整除的。)

{2,5},{12,15},{32,35}, {42,45}, {4,25}, 10, {20,50} 30, 40

*2.比5400大的四位整数中,数字2,7不出现,且各位数字不同的整数由多少个?

加法原则,如果首位大于5则,可以为6,8, 9, 于是有 。如果首位为5,则次高位可以为4,6, 8, 9,于是有,所以总的个数为:

*3.12个人围坐在圆桌旁,其中一个拒绝与另一个相邻,问有多少种安排方法?

减法原则。

4. 有颜色不同的四盏灯。

(1) 把它们按不同的次序全部挂在灯杆上表示信号,共有多少种不同的信号?

(2) 每次使用一盏、二盏、三盏或四盏灯按一定的次序挂在灯杆上表示信号,共有多少种不同的信号?

(3) 在(2)中,如果信号与灯的次序无关,共有多少种不同的信号?

5. 现在有100件产品,从中任意抽取3件。

(1)共有多少种抽法?

(2) 如果100件产品中有2件次品,那么抽出的产品中至少有一件是次品的概率是多少?

(3) 如果100件产品中有2件次品,那么抽出的产品中恰好有一件是次品的概率是多少?

6. 把个负号和个正号排在一条直线上,使得没有两个负号相邻,证明不同的排法有种。

证明:先把个正号排在一条直线上,那么包括两头在内,留出了个空位置。由于负号不能相邻,所以原问题等价于从这个空位置中选择个位置把负号放入其中,则总的个数为:

7. 8个棋子大小相同,其中5个红的,3个蓝的,把它们放在的棋盘上,每行每列只能放一个,问有多少种放法?若放在的棋盘上,结果如何?

参考2.4节例6

编程题Leetcode 51.N-Queens, 52.N-Queens II, 36-Valid Sudoku, 37.SudoKu Solver 暴力枚举;回溯法

先选位置再选颜色。

对于的棋盘,每行都必须要放置一个棋子,可以先固定行,然后第1个棋子有8种列坐标可选,第2个棋子有7种列坐标可选,依次下去,总的选法数为8!,然后从8个棋子种选择5个着色为红色(这一步也可以看成计算多重集合上的全排列个数)。

如果是的棋盘则先从12行中选择8行(无序),在从12列中排列8列(有序),然后选择5个棋子着为红色即可

8. 有纪念章4枚、纪念册6本,赠送给10位同学,每人得一件,共有多少种不同的送法?

解法一:从10位同学中选择4位送纪念章,那么后剩余6位一定是送纪念册咯。

解放二:匹配问题,可以看成给10个人打上送纪念章或纪念册的标签,那么就是多重集合的全排列。(0,1分别对应纪念章和纪念册)

*9.

(1)从整数1,2,…,100中选出两个数,使得它们的差正好是7,有多少种不同的选法?

可以取两个数,为不失一般性不妨取 ,则有,由于,则可以取.则一种有93种取法

(2)如果要求两数之差小于等于7,又有多少种不同的选法?(注意:应该是两数之差的绝对值小于等于7更加准确地反映出题意)

可以取两个数,为不失一般性不妨取 ,则有,由于, 当x取1时,y可以取{2,3,4,5,6,7,8},可以类推到x取到93的情况,当x取{94,95,… ,99, 100},y只需要取比x大的数即可。总的选法为:

*10.试求不定方程满足 的整数解个数?

,则

11. 在一次选举中,甲、乙分别得到a张和b张票(a>b),将全部a+b张选票按某种顺序排列,依次计票时甲所得的票数总是比乙多.问这种排列方法有多少种?

该问题与第12题是等价的。相当于共有a个元素进栈,那么需要出栈b个元素一共有多少种不同的可能。 把1当成进栈,0当成出栈,那么共有(a+b)个移动次序,并满足任意时刻,进栈数大于出栈数(a>b)。

该问题与13题是等价的。相当于于计数(0, 0)点到(a, b)点的不穿过直线y=x的非降落路径数。(只考虑直线y=x下三角的情况)设往右走对应于甲的票,往上走对应于乙的票,那么不穿过直线y=x就保证了依次计票时甲所得得票数总是比乙多。

方法一:可以转换成13题的几何形式

方法二:写成递归函数,Catalan数

12. n个不同的字符顺序进栈恰一次,问有多少种不同的出栈方式?

参考7.2节Catalan数

编程题 Leetcode 946.Validate Stack Sequences 模拟

设f(n)为n个不同字符对应的计数。

*13. 计数(0, 0)点到(n, n)点的不穿过直线y=x的非降落路径数.

参考2.4节例3,7.2节例3

编程题 Leetcode 62.Unique Paths, 63 Unique Paths II 写成递推方程,用递归或者动态方程计算;用组合数表达出总的次数,转而编程计算组合数

从可以先从(0,0)到达(0, 1)或者(1, 0),这两个点到(n,n)而不穿过的非降落路径数是相等的。于是可以考虑从(1,0)到(n,n)不穿过直线的非降落路径数,由于不穿过,那么必定是要经过点(n, n-1)。

从(1,0)到(n,n-1)的非降落路径数为:

从(1, 0)到(n, n-1)穿过直线的非降落路径和从(0, 1)到(n, n-1)的非降落路径是对称的等于:

于是从点(0, 0)点到(n, n)点的不穿过直线y=x的非降落路径数为:

14. 有n个不同的整数,从中取出两组来,要求第一组的最小数大于第二组里的最大数,问有多少种方案?

可以把这n个数一一映射到集合{1, 2, …, n}上。依次取确定第二组里最大的数为n,n-1,…, 1;相应的第二组可以从剩余的n-1, n-2, …. 0个数中任意取整数构成一个组。则有:

15. 试求n个完全一样的骰子能掷出多少种不同的点数?

一个骰子有6个面,点数依次为1,2,3,4, 5, 6。则, 计算函数f(n)值域的大小,为

16.凸10边形的任意3条对角线不共点,试求该凸10边形的对角线交于多少个点?又把所有的对角线分割成多少段?

相交的点数:

每条对角线分割成的段数:

17. 设 ,其中是l个不同素数,试求能整除n的正整数数目。

素数分解定理,确保了任意整数能够被分解为多个素数的乘积形式。使用乘法法则,总的数目为:

18. 将52张牌平均分给4个人,问每个人有一个5张牌的同花顺的概率是多少?

2: {3, 4, 5, 6, 7}, {4, 5, 6, 7, 8}, {5, 6, 7, 8, 9}

1: {6, 7, 8, 9, 10}, {7, 8, 9, 10 ,J}

19.取定空间中的25个点,其中任意4点均不共面,问它们能决定多少个三角形?又能决定多少个四面体?

三角形个数, 四面体个数

20. 考虑集合的非空子集.

(1)证明最大元素恰好是j的子集数为.

如果集合A中的最大元素为j,那么A还可能包含的数。利用乘法法则,个数为

(2)利用(1)的结论证明

根据最大元素的不同可以把集合划分为n+1个不互斥的子集,但是不包含空集。从而有:

21. 从整数1,2,…1000中选取3个数,使得它们的和正好被4整除,问有多少种选法?

按对4取模的结果{0, 1, 2, 3}把这1000个数划分为4个等价类,代表元分别为0,1,2,3,每个类的元素个数相等。则有{013, 112, 220, 332, 000},总的选法为:

22.

(1)在由5个0和4个1组成的字符串中,出现01或10的总的次数为4的字符串有多少个?

(2)在由m个0和n个1组成的字符串中,出现01或10的总的次数为k的字符串有多少个?

*23. 5 封不同的信用通信通道传送,在两封信之间至少要放3个空格,一共要加入15个空格,问有多少种方法?

如果第1封信之前和第5封信之后允许放置空格,则, 其中。等价于 , 其中。则总的次数为:

24. 将a,b.c,d,e,f,g,h排成一行,要求a在b的左侧,b在c的左侧,问有多少种排法?

设n为字母的个数,根据b所在的位置可以为

25.从1至100的整数中不重复的选取两个数组成有序对(x, y),使得x与y的乘积xy不能被3整除,

按对3取模的结果{0, 1, 2}把这100个数划分为3个等价类代表元分别为0,1,2,三个类的元素个数分别为:33, 34, 33。不能被3整除的取法为11, 12,22。总的个数为:

26. 在的棋盘中选取两个相邻的方格(即有一条公共边的方格)有多少种不同的选取方法?

可以到, 总的选取方法为:

27. 某电影院票房前有2n个人排队,每人欲购买一张5元的电影票.在这些人中,有n个人,每人有一张5元钞票,其余每人有一张10元钞票,而票房在卖票前无任何钞票,问使得每个人都能顺利地买到电影票的排队方式有多少种?

思路和题11,12,13类似。从前往后计数,拥有5元钞票的人的个数必须大于等于10人钞票的人数;同时要考虑到每个人是不同的物体。

28.证明下列组合恒等式:

(1)

怎么看着像卷积公式

(2)

(3)

(4)

(5)

(6)

29. 以 表示用m种颜色去涂棋盘,使得相邻格子异色的涂色数,证明

用坐标(x, y)来表示格子的位置 第一次涂(1,1),有m种选择,第二次涂(2, 1)有m-1种选择。现在涂(1, 2)和(2,2),有两种情况。如果(1,2)和(2,1)的颜色相同,则(2,2)有m-1种选择;如果(1,2)和(2,1)颜色不同则有(m-2)种选择,(2,2)也有m-2种选择;可以看出的情况类似,依次归纳下去n-1次则有

30. 上题中,若以 表示m种颜色去涂 棋盘,使得相邻格子异色且每种颜色至少使用一次的涂色方案,求 的计数公式.

二项式反演公式:设是两个数列,s是非负整数,如果对任意的不小于s的整数n,都有,则对于如果对任意的不小于s的整数n,都有

31. 有20根完全相同的木棍从左到右竖立成一行,占据20个位置。要从中选出6根。

(1) 有多少种选择?

考虑位置不同

(2) 如果选出的木棍中没有两根是相邻的,又有多少种选择?

, 总的个数为

def f(n, m):
    if m == 0:
        return 1
    if n < (2*m - 1):
        return 0
    elif n ==  2*m-1:
        return 1
    else:
        tmp = 0
        for i in range(1, n+1):
            tmp += f(n-i-1, m-1)
        return tmp
f(20, 6)

(3) 如果在所选出的每一对木棍之间必须至少有两根棍,有多少中选择?

, 总的个数为


def g(n, m):
    if m == 0:
        return 1
    if n < (3*m - 2):
        return 0
    elif n ==  3*m-2:
        return 1
    else:
        tmp = 0
        for i in range(1, n+1):
            tmp += g(n-i-2, m-1)
        return tmp
        
g(20, 6)

ch03二项式系数

Last updated: Wednesday 14 January 2026 @ 16:54:45

Contributors

转载自liuzengh/combinatorial-mathematics

1.用二项式定理展开

2.的展开式中,的系数是什么?的系数是什么?

,

*3. 证明

(1)设 为大于等于2的整数,则:

微分. 对等式两边在 处求导数,得左边 ,右边,从而

(2) 设为正整数,则

积分. 对等式两边求上的定积分,得左边, 右边 ,从而

*4. 给出的组合意义

等式右端相当于点到点的路径数,我们将这些路径数分为如下类: 第 是从点途经点,然后沿垂直方向走到点,最后到达点,路径数为:.根据加法原理,有

5. 给出 的组合意义

参考3.3节 等式4

, n+1元集合的r+1元子集可以分为两类:第一类r+1元子集含, 第二类r+1元子集不含a_1.第一类r元子集中的任一个去掉。第一类r+1元子集中的任一个去掉后,就是的r元子集;反过来,任给一个的r元子集,添上后就是A的元子集,故两者之间有一一对应的关系。因此,第一类r+1元子集共有个.第二类r+1元子集就是A-{a_1}的r+1元子集,共有。然后采用相同的思路对第二类r+1元子集依次考虑含不含继续分类下去。最后得到:

6. 证明

利用题目12的结论,然后把 2^n 展开成

7. 利用,求

利用题目5的结论。

8.求整数,使得,并计算

类似于题目7

9.证明

参考3.3节 等式5

10.证明

(1)在由数字集生成的长度为的字符串中, 0出现偶数次的字符串有

奇数次( ) + 偶数次( ) = 所有情况()

(2) 设 ,则

利用(1)的组合意义,把出现偶数次的字符串依次分为0次, 2次, 4次, , 次。根据加法原则可以得到左边等于右边。

*11. 证明

等式左边可以写成, 右边可以写成.可以从组合意义上来证明这个等式,\C_{2n}^n是从元集合A的的组合数,把集合,使, 则从A的n元子集可以分为如下n类:从中选取个元素,从中选取个元素,将从中取出的元素并到一起构成A的第i类n-1 元子集,则第i类子集的个数为: , 根据加法原则可以得到:

12. 证明:对一切整数,有

13.用多项式定理展开

14.确定的展开式中 项的系数

15.用组合学方法证明恒等式

利用递推公式,可以将展开, 。从而有

16.求出并证明下面式子的结果

可以看出这个式子是多项式, 项数的系数,则有

17. 试运用归纳法证明

18. 令n和k为正整数,给出以下恒等式的组合学证明:

19.用牛顿二项式定理近似计算

def fun(r):
    if r == 0:
        return 1
    return r * fun(r-1)
   
ans = 0
for r  in range(0, 30):
    sign = 1 if r%2 else -1
    tmp = 1
    for j in range(2, r+1): 
        tmp *= (2*j-3)
    ans =  ans + (sign *  tmp / fun(r))
    

20

(1) 证明 是一个整数;

= $$ \sum_{i=0}^{m}C_{2m+1}^{2i} (\sqrt 3)^{2i} = \sum_{i=0}^{m}C_{2m+1}^{2i} 3^i $,所以 $(1+\sqrt3)^{2m+1} + (1-\sqrt3)^{2m+1}$是一个整数 $$

(2) 证明 是 -1和0之间的一个数,并且 的小数部分

, 因为,所以 介于0到1之间,从而 是 -1和0之间的一个数。 根据(1)的结论, 减去 是整数,且 是0和1之间的一个数,可以得出 的小数部分。

ch04容斥原理

Last updated: Wednesday 14 January 2026 @ 16:54:45

Contributors

转载自liuzengh/combinatorial-mathematics

from scipy.special import perm, comb, factorial

1.在1与1000之间不能被4,5和6整除的数有多少个?

令集合, 记集合分别表示从1到1000中能被4,5和6整除的数。则1与1000之间不能被4,5和6整除的数的个数为:

*2.求1到500中能被3和5整除,但是不能被7整除的数的个数?

能被3和5整除等价于能被15整除,在能被15整除的基础上减去同时能被7整除的书,就等于能被15整除而不能被7整除的数。 能被15整除的数的个数为: ; 能被105整除的数的个数为: ;所以求1到500中能被3和5整除,但是不能被7整除的数的个数为:

*3. 求1与1000之间既不是平方数又不是立方数的整数的个数。

,则记分别为1到1000中的平方数集合和立方数的集合,表示1到1000中既是平方数又是立方数的的集合则有: 于是 表示中既不是平方数又不是立方数的整数, 则1与1000之间既不是平方数又不是立方数的整数的个数:

*4. 求多重集合

参考 4.3节例1

, 则的10组合数为:, 设集合A是的10组合数全体,则,定义A上的性质集合,其中:

:A中的元素b的的个数大于等于4;

:A中的元素c的的个数大于等于6;

:A中的元素d的的个数大于等于8;

将满足性质 的10组合数全体记为, 那么依次有: , ,

, ,

.

所以A中的元素b的的个数小于等于3, 元素c的的个数小于等于5,元素d的的个数小于等于7的10组合数个数为:

*5. 求不定方程的数值不超过8的正整数解的个数。

*6. 在宴会后,7位男士检查他们的帽子,问有多少种方法,使得

(1)没有人接到自己的帽子?

(2)至少有一人接到自己的帽子?

(3)至少有两人接到自己的帽子?

总数 - 没有人接到自己的帽子的方法数 -恰好只有一个人接到自己的帽子的方法数:

*7.求集合的排列数,使得在排列中正好有k个整数在它们的自然位置上(所谓自然位置,就是整数i排在第i位上)

8. 求多重集合的全排列数,使得在这些排列中同一个字母的全体不能相邻(例如,不允许 abbbbcaac,但允许baabbacbc)

9. 是偶数当且仅当n是奇数。

根据递推公式:

*10.证明

ch05生成函数

Last updated: Wednesday 14 January 2026 @ 16:54:45

Contributors

转载自liuzengh/combinatorial-mathematics

*1. 求下列序列的生成函数

(3) 0, 13, 24, , , ;

*2. 利用生成函数计算下列和式:

(2) 13, 24, , , ;

序列的生成函数为:

对应有

3. 序列的指数型生成函数为

(1)证明: 序列的指数型生成函数为


所以序列的指数型生成函数为

(2)计算


第n项为:

4. 从中取出n个字母,要求a的个数为偶数,问有多少种取法?


第n项:

*5. 由字母a,b,c,d,e组成的长为n的字中,要求a与b的个数之和为偶数,问这样的字有多少个?

排列型分配问题的指数生成函数。

1.a 与 b 的个数均为奇数:

2.a 与 b 的个数均为偶数:


的系数为 , 该系数即为总的字个数。

*6 证明: 方程

有相同数目的非负整数解。 证明: ,

, 的系数为
,的系数为
因为,所以方程有相同数目的非负整数解。

7. 设多重集合, 表示集合S满足下列条件的n组合数,分别求数列的生成函数。

(1)每个出现奇数次;

(2)每个出现3的倍数次;

(3)不出现,至多出现1次;

*(4)出现1,3或11次,出现2,4或5次;

(5)每个至少出现10次;

8.用恰好k种可能的颜色做旗子,使得每面旗子由条彩带构成,且相邻两条彩带的颜色不同,求不同的旗子数。

9. 在 之间有多少个整数,其各位数字之和等于5?

0到100之间各位数字之和等于5的数有6个: 05,14,23,32,41,50

10.用生成函数证明下列等式:

(1)

(2)

(3)

11. 设多重集合, 表示集合S满足下列条件的n排列数,分别求数列的指数型生成函数。

(1)S的每个元素出现奇数次;

(2)S的每个元素至少出现4次;

*(3)至少出现i次();

(4)至多出现i次();

*12. 设有砝码重为1g的3个,重为2g的4个,重为4g的2个,问能称出多少种重量?各有几种方案?

能称出 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,16, 17, 18, 19 一共20种重量,其中 的系数代表称出i种重量的方案数

13.证明时,有:

import sympy
from sympy import init_printing
x = sympy.Symbol("x")
f = (1+x+x**2+x**3) * (1+x**2 + x**4 + x**6 + x**8) *(1+x**4 + x**8)
sympy.latex(sympy.expand(f))

'x^{19} + x^{18} + 2 x^{17} + 2 x^{16} + 3 x^{15} + 3 x^{14} + 4 x^{13} + 4 x^{12} + 5 x^{11} + 5 x^{10} + 5 x^{9} + 5 x^{8} + 4 x^{7} + 4 x^{6} + 3 x^{5} + 3 x^{4} + 2 x^{3} + 2 x^{2} + x + 1'

*14 设将N无序分拆成正整数之和且使得这些正整数都小于或等于m的方法数为.证明

, 可以划分为两类,一类是,直接从N去掉该分部量, ; 另外一类是, 所以, 即。 根据加法原理有:

15 设表示将N有序分拆成n个分部量且每个分部量都小于或等于m的分拆数,证明就是的展开式中的系数

16.假定工人A适合工作3,4,5,工人B适合工作2,3,而工人2,3,而工人C适合工作5。同样每一名工人至少指定一项工作,每一项工作不超过一名工人,一名工人只得到他适合的一项工作。建立一个生成函数并使用它回答问题。

有多少种方法给一名工人指定一项工作?
有多少种方法给两名工人指定一项工作?
有多少种方法给三名工人指定一项工作?

17.假设,且,如果是序列的指数生成函数,是序列的指数生成函数,推导之间的关系

18. 令表示具有条边的凸边形区域被其对角线所分成的区域数,假设没有三条对角线共线。定义。证明

然后确定生成函数,并由此得出的公式。

19.如果要把棋盘上偶数个方格涂成红色,试确定用红色、白色和蓝色对棋盘的方格涂色的方法数。

, 其中 的系数就是满足要求的涂色方法数.

*20 在一个程序设计课程里,每个学生的每个任务最多可以运行十次。教员发现某个任务共运行38次。设有15名学生,每个学生对这个任务至少做一次。求观察到的总次数的组合数。

组合数的生成函数
的系数为就是观察到的总次数的组合数。

21. 证明:

ch06递推关系

Last updated: Wednesday 14 January 2026 @ 16:54:45

Contributors

* [1. 在平面上画n条无限直线,每对直线都在不同的点相交,它们构成的无限区域数记为<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span>, 求<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span>满足的递推关系。](#1-在平面上画n条无限直线每对直线都在不同的点相交它们构成的无限区域数记为fn-求fn满足的递推关系)
* [2. n位三进制数中,没有1出现在任何2的右边的序列的数目为<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span>,求<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span>满足的递推关系。](#2-n位三进制数中没有1出现在任何2的右边的序列的数目为fn求fn满足的递推关系)
  * [*3. n位四进制数中,若:](#3-n位四进制数中若)
  * [4. 凸<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span>边形中,由所有对角线分割的区域数记为<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span>.假设没有三条对角线交于一点,求<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span>满足的的递推关系。](#4-凸n2边形中由所有对角线分割的区域数记为fn假设没有三条对角线交于一点求fn满足的的递推关系)
  * [*5. 求n位0,1序列中"101"只出现一次且在第n位出现的序列数<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span>](#5-求n位01序列中101只出现一次且在第n位出现的序列数fn)
  * [6.求解下列递推关系:](#6求解下列递推关系)
  * [(1) <span class="katex-display"><span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">9</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">9</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">3</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace nobreak"> </span><span class="mspace nobreak"> </span><span class="mspace nobreak"> </span><span class="mspace nobreak"> </span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord">0</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span></span>](#1-fn--fn-1--9fn-2-9fn-3nge3--f00-f11f22)
  * [(3)](#3)
  * [7.求解下列递推关系:](#7求解下列递推关系)
  * [(1)<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord">0</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">789</span></span></span></span>](#1nfn--n-1fn-1--2nnge1-f0789)
  * [(2) <span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">0</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord">0</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span></span></span></span>](#2-f2n--2fn-1--0nge-1-f0--4)
  * [(3) <span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">n</span><span class="mclose">!</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord">0</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span>](#3-fn-nfn-1nnge-1-f0--2)
  * [8.求解下列递推关系:](#8求解下列递推关系)
  * [(1) <span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mclose">)</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord">0</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>](#1-fn--n2fn-1nge-1-f0--1)
  * [(2) <span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.3651em;vertical-align:-0.52em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.52em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord">0</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>](#2-fn--fn-1--frac1nn1nge-1-f0--1)
  * [(3) <span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7477em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">−</span><span class="mord">1</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord">0</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>](#3-fn2---fn--3cdot-2n--4cdot--1n-f00-f1--1)
  * [9. 求下列n阶行列式的值](#9-求下列n阶行列式的值)
  * [10. 求解习题1~4所列出的递推关系.](#10-求解习题14所列出的递推关系)
* [11. <span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span>棋盘用红、白、蓝三种颜色进行着色,不允许相邻两格都着红色,求着色方案数满足的递推关系,并求出着色方案数。](#11-1times-n棋盘用红白蓝三种颜色进行着色不允许相邻两格都着红色求着色方案数满足的递推关系并求出着色方案数)
  * [12. 求矩阵](#12-求矩阵)

转载自liuzengh/combinatorial-mathematics

1. 在平面上画n条无限直线,每对直线都在不同的点相交,它们构成的无限区域数记为$f(n)f(n)f(n)=f(n-1)+n, f(1)=2~~~~ n\in N^+$

2. n位三进制数中,没有1出现在任何2的右边的序列的数目为$f(n)f(n)f(n) = 2f(n-1) + 2^{n-1}, f(1) = 3$

*3. n位四进制数中,若:

(1) 有偶数个0的序列共有$f(n)$个;
(2)有偶数个0且有偶数个1的序列共有$g(n)f(n), g(n)f(1) = 34^{n-1}f(n-1)4^{n-1}-f(n-1)3f(n-1)4^{n-1}-f(n)f(n) = 3f(n-1)+4^{n-1}-f(n-1) = 2f(n-1) + 4^{n-1}, f(1) = 3g(1) = 2q(n)4^{n-1}g(n-1)2g(n-1)4^{n-1}-g(n-1)-q(n-1)4^{n-1}-g(n-1)-q(n-1)g(n) = 2g(n-1) + 4^{n-1}-g(n-1)-q(n-1) = 4^{n-1} + g(n-1) - q(n-1), (1)q(n) = 4^{n-1} + q(n-1) - g(n-1) , (2)q(n)+g(n) = 2\cdot 4^{n-1}, q(n-1) = 2\cdot 4^{n-2}-g(n-1)g(n) = 2g(n-1) + 2\cdot 4^{n-2}, g(1) = 2$

4. 凸$n+2f(n)f(n)n+2XP_1, P_2, \cdots, P_{n+1}P_1,P_{n+1}XP_1, \cdots, P_{n+1}P_iP_kP_jXP_kP_iP_jP_1, P_2, \cdots, P_{n+1}C_{n+1}^3XP_1P_{n+1} f(n-1) + C_{n+1}^3+ n$

*5. 求n位0,1序列中“101“只出现一次且在第n位出现的序列数$f(n)2^{n-3}f(n)f(n-2)f(n-3)2f(n-4)2^{i-3}f(n-1)3\le i \le n-3f(n) = 2^{n-3}-f(n-2)-f(n-3)-2f(n-4)-\cdots-2^{n-6}f(3), n\ge6, f(3)=1, f(4)=2, f(5)=3$

6.求解下列递推关系:

(1) $x^3 -x^2 - 9x+9 = 0, (x-1)(x-3)(x+3) = 0, x_1 = -3, x_2=1, x_3 = 3c_1(-3)^n + c_2(1)^n+ c_3(3)^nc_1 + c_2 + c_3 = 0,

-3c_1+c_2 + 3c_3 = 1, 9c_1 + c_2 + 9c_3 = 2c_1 = -\frac{1}{12}, c_2=-\frac{1}{4}, c_3 = \frac{1}{3}f(n) = -\frac{1}{12}(-3)^n -\frac{1}{4} + \frac{1}{3}3^n$

(2)

$f(n) = 3f(n-2)-2f(n-3) , n \ge 3, f(0) = 1, f(1) = 0, f(2) = 0;x^3 - 3x+2 = 0(x-1)^2(x+2) = 0x_1 = 1, x_2 = 1, x_3 = -2x = 1c_11^n+c_2n1^n = c_1+c_2nx = -2c_3(-2)^nc_1+c_2n+c_3(-2)^nc_1 +c_3 = 1 ,, c_1+c_2-2c_3 = 0 ,, c_1 + 2c_2 + 4c_3 = 0c_1 = \frac{8}{9}, c_2 =-\frac{2}{3} ,c_3 = \frac{1}{9}f(n) = \frac{8}{9} -\frac{2}{3}n+ \frac{1}{9}(-2)^n$

(3)

$f(n) = 4f(n-1)-3f(n-2)+3^n, n\ge2, f(0)=1, f(1)=2x=3an3^nan3^n = 4a(n-1)3^{n-1} - 3a(n-2)3^{n-2} + 3^na = \frac{3}{2}c_1 + c_23^n\frac{3}{2}n3^n + c_1 + c_2 3^nc_1 + c_2 = 1, \frac{9}{2} + c_1 + 3c_2 = 2c_1 = \frac{11}{4} , c_2 = -\frac{7}{4}\frac{3}{2}n3^n + \frac{11}{4} + -\frac{7}{4} 3^n$,

7.求解下列递推关系:

(1)$nf(n) + (n-1)f(n-1) = 2^n(n\ge1), f(0)=789f(n) = -\frac{n-1}{n}f(n-1) + \frac{2^n}{n} = -\frac{n-1}{n}(-\frac{n-2}{n-1}f(n-2) + \frac{2^{n-1}}{n-1}) + \frac{2^n}{n} = \frac{n-2}{n}f(n-2)-\frac{2^{n-1}}{n}+

\frac{2^n}{n} = \frac{1}{n}\sum_{i=0}^{n}(-1)^{i+1}2^i$

(2) $f^2(n) + 2f(n-1) = 0(n\ge 1), f(0) = 42ln,f(n) + ln2 + ln,f(n-1) = 0g(n) = ln,f(n), g(0) = ln,4g(n) = -\frac{1}{2}g(n-1) -\frac{ln2}{2}g(n) = (-\frac{1}{2})^nln,4 - n\frac{ln2}{2}f(n) = \frac{4^{(-\frac{1}{2})^n}}{2^{\frac{n}{2}}} = 2^{2(-\frac{1}{2})^n - \frac{n}{2}}$

(3) $f(n) =nf(n-1)+n!(n\ge 1), f(0) = 2f(n) = nf(n-1)+n! = n(n-1)f(n-2) + 2n! = 2\cdot n! + n\cdot n!$

8.求解下列递推关系:

(1) $f(n) = (n+2)f(n-1)(n\ge 1), f(0) = 1\frac{f(n)}{f(n-1)} \frac{f(n-1)}{f(n-2)} \cdot \frac{f(1)}{f(0)} f(0))= (n+2)(n+1)\cdots 3\cdot 1 =\frac{(n+2)!}{2}$

(2) $f(n) = f(n-1) + \frac{1}{n(n+1)}(n\ge 1), f(0) = 1(f(n) - f(n-1)) + (f(n-1)-f(n-2)) + \cdots + (f(1)-f(0)) + f(0) = (\frac{1}{n}-\frac{1}{n+1}) + (\frac{1}{n-1}-\frac{1}{n} ) + \cdots + (\frac{1}{1} - \frac{1}{2}) + 1 = 2 -\frac{1}{n+1}$

(3) $f(n+2) - f(n) = 3\cdot 2^n + 4\cdot (-1)^n, f(0)=0, f(1) = 1f(n) = f(n-2) + 3\cdot 2^{n-2} + 4 \cdot (-1)^{n-2} = f(n-4) + 3\cdot (2^{n-2}+2^{n-4}) + 4 \cdot ((-1)^{n-2}+(-1)^{n-4}) f(n) = f(0) + 3\cdot (2^{n-2}+2^{n-4} +\cdots + 2^0) + 4 \cdot ((-1)^{n-2}+(-1)^{n-4} + (-1)^0) = \frac{(1-4^{n/2})}{1-4} + 4\cdot \frac{n}{2} = \frac{4^{n/2}-1}{3}+2nf(n) = f(1) + 3\cdot (2^{n-2}+2^{n-4} +\cdots + 2^1) - 4 \cdot ((-1)^{n-2}+(-1)^{n-4} + (-1)^1) = \frac{(1-4^{(n+1)/2})}{1-4} - 4\cdot \frac{n+1}{2} = \frac{4^{(n+1)/2}-1}{3}-2n-2$

9. 求下列n阶行列式的值

$d(n) = 2d(n-1)-d(n-2), d(1)=2, d(2)=3$

10. 求解习题1~4所列出的递推关系.

  1. $f(n) = n + (n-1) + (n-2) + \cdots + 2 + f(1) = \frac{n^2+n+2}{2}f(n) = 2f(n-1)+2^{n-1}+2(f(n-2)+2^{n-2})+2^{n-1} = 2f(n-2)+2^{n-1}+2^{n-1} = 2f(n-3)+2^{n-2}+2^{n-1}+2^{n-1} = 2f(1)+2^2+\cdots+2^{n-1}+2^{n-1} = 2^n + 2^{n-1} + 2, n\ge2, f(1)=3f(n) = 2f(n-1) + 4^{n-1} = 2f(n-2)+2\cdot 4^{n-2}+4^{n-1} = 2f(1)+2\cdot(4+4^2+\cdots + 4^{n-2}) + 4^{n-1}=\frac{5}{3}4^{n-1}+\frac{10}{3} , n\ge 2f(1) = 3g(n) = 2g(n-1) + 2\cdot 4^{n-2}=2g(n-2)+2\cdot 4^{n-3}+2\cdot4^{n-2} = 2g(1)+2\cdot(4^0+4^1+\cdots + 4^{n-2})=\frac{2}{3}4^{n-1}+\frac{10}{3}, g(1) = 2f(n) = f(n-1) + C_{n+1}^3+ n = f(1) +(C_3^3 + C_4^3 + \cdots + C_{n+1}^3) + (2+3+\cdots +n) = C_{n+2}^4+C_{n+1}^2, ~~~~f(1)=1$

11. $1\times nf(n) = 2f(n-1) + 2f(n-2), f(1)=3, f(2) = 8x^2 - 2x-2 = 0, x_1 = 1-\sqrt 3, x_2 = 1+\sqrt 3c_1(1+\sqrt3)^n + c_2(1-\sqrt3)^nc_1(1+\sqrt3) + c_2(1-\sqrt3) = 3, c_1(4+2\sqrt3)+c_2(4-2\sqrt3)=8c_1 = \frac{3-8\sqrt3}{18}, c_1 = \frac{3+8\sqrt3}{18}, f(n) = \frac{3-8\sqrt3}{18}(1+\sqrt3)^n + \frac{3+8\sqrt3}{18}(1-\sqrt3)^n$

12. 求矩阵

$(3^n, 2^n) {\left( \begin{matrix} 3^n & f(n) \ 0 & 2^n \end{matrix} \right)} {\left( \begin{matrix} 3 & -1 \ 0 & 2 \end{matrix} \right)}

{\left( \begin{matrix} 3^{n+1} & 2f(n)+2^{n+1}-3^n \ 0 & 2^{n+1} \end{matrix} \right)} f(n+1) = 2f(n)+2^{n+1}-3^n, f(1)=-1$

13.从1到n的自然数中选取k个不同且不相邻的数,设次选取的方案数为$f(n, k)$.

考虑两种情况,选n和不选n。

(1)求$f(n,k)f(n, k) = f(n-1, k) + f(n-2, k-1), f(n, 1)=n, f(2k-1, k)=1 f(n, k)=0, n\lt2k-1$

(2)用归纳法求$f(n, k)f(n, 1) = n = C_{n+1-1}^1, n\ge1f(n, n) = n = C_{n+1-n}^n, n\ge1 i\le j\le n, f(j, i)=C_{j+1-i}^if(n+1, k)=f(n, k) + f(n-1, k-1)=C_{n+1-k}^k + C_{n-1+1-(k-1)^{k-1}}=C_{(n+1)+1-k}^kf(n, k) = C_{n+1-k}^k$

(3)若设1与n算是相邻的数,并设在此假设下从1到n的自然数中选取k个不同且互不相邻的数的方案数为$g(n,k)f(n, k)g(n, k)g(n,k) = f(n-1, k) + f(n-3, k-1), g(n, 1) = n$

14.利用生成函数求解下列递推关系

(1) $f(n) = 4f(n-2), f(0)=0, f(1)=1;A(x) = \frac{1}{4}(\frac{1}{1-2x} - \frac{1}{1+2x}) = \sum_{n=0}^{\infty}\frac{1}{4}(2^n-(-2)^{n})x^n$

(2)$f(n) = f(n-1) + 9f(n-2)-9f(n-3),n\ge3, ~~~~ f(0)=0, f(1)=1,f(2)=2A(x) - f(0) - xf(1)-x^2f(2) =\sum_{n=3}^{\infty}f(n)x^n = \sum_{n=3}^{\infty}(f(n-1)+9f(n-2)-9f(n-3))x^n = x\sum_{n =2}^{\infty}f(n) + 9x^2\sum_{n =1}^{\infty}f(n) -9x^3\sum_{n =0}^{\infty}f(n) = x[A(x)-f(0)-xf(1)]+9x^2[A(x)-f(0)]-9x^3A(x)A(x) = \frac{x^2+x}{9x^3-9x^2-x+1} = \frac{1}{3}\frac{1}{1-3x} -\frac{1}{12}\frac{1}{1-(3x)} -\frac{1}{4} \frac{1}{1-x} = \sum_{n=0}^{\infty}(-\frac{1}{12}(-3)^n -\frac{1}{4} + \frac{1}{3}3^n)x^n$

(3) $f(n) = 3f(n-2)-2f(n-3) , n \ge 3, f(0) = 1, f(1) = 0, f(2) = 0;A(x) - f(0) - xf(1)-x^2f(2) =\sum_{n=3}^{\infty}f(n)x^n = \sum_{n=3}^{\infty}(3f(n-2)-2f(n-3))x^n = x^2\sum_{n =1}^{\infty}f(n) + 2x^3\sum_{n =0}^{\infty}f(n) = x[A(x)-f(0)]+A(x)A(x) = \frac{1-3x^2}{2x^3-3x^2+1} = \frac{1-3x^2}{(1-x)^2(2x+1)} = \frac{14}{9}\frac{1}{1-x}-\frac{2}{3}\frac{1}{(1-x)^2}+\frac{1}{9}\frac{1}{1-(-2x)}f(n) = \frac{14}{9} - \frac{2}{3}(n+1) + \frac{1}{9}(-2)^n = \frac{8}{9} -\frac{2}{3}n+ \frac{1}{9}(-2)^n$

15. 设k是正整数,证明:对任意一组常数$d_1, d_2, \cdots, d_k\sum_{j=1}^{k}d_jC_{n+j-1}^{j-1}k-1\sum_{j=1}^{k}d_jC_{n+j-1}^{j-1}C_{n+j-1}^{j-1}j-1j=kk-1k-1d_1, d_2, \cdots, d_kC_{n+j-1}^{j-1}$的系数。

16. 某人有n元钱,她每天去菜市场买一次菜,每次买菜的品种很单调,或者买一元钱的蔬菜,或者买两元钱的猪肉,或者买两元钱的鱼。那么,她有多少种不同的方式花完这n元钱?

$f(n) = f(n-1) + 2f(n-2), f(1) = 1, f(2) = 3x^2-x-2=0, x_1=-1, x_2=2c_1(-1)^n + c_22^n-c_1 + 2c_2 = 1, c_1 + 4c_2 = 3, c_1=\frac{1}{3}, c_2 = \frac{2}{3}\frac{1}{3}(-1)^n + \frac{2}{3}2^n f(n) = f(n-1) + C_{n+1}^3+ n = f(1) +(C_3^3 + C_4^3 + \cdots + C_{n+1}^3) + (2+3+\cdots +n) = C_{n+2}^4+C_{n+1}^2, ~~~~f(1)=1$

17.在圆周上任取n个不同的点,过每两点做一条弦。假设这些弦中没有三条在圆内交于一点,令$a_na_n = C_n^4 + C_n^2 + 1n+2f(n) = f(n-1) + C_{n+1}^3+ n, ~~~~f(1)=1a_n = f(n-2)+na_n= C_{n}^4+C_{n-1}^2+n = C_n^4 + C_n^2 + 1$

18. 设集合$S_n = {1, 2, \cdots, n}S_nS_n$的奇(偶)子集。

(1)求证:$S_nA_n, B_nS_nA(n+1) = A(n)+B(n), B(n+1) = A(n)+B(n), A(1)=B(1) = 1, n为偶数A(n+1) = A(n)+A(n), B(n+1) = B(n)+B(n), A(1)=B(1) = 1, n为奇数A(n) = B(n)$
(2)求证: 当$n\ge 3S_nf(n), g(n)S_nf(n+1) = f(n)+(n+1)B(n)+g(n), g(n+1) = g(n)+(n+1)A(n)+f(n), f(1)=1, g(1) = 0, n为偶数f(n+1) = f(n)+(n+1)A(n)+f(n), g(n+1) = g(n)+(n+1)B(n)+g(n), f(1)=1, g(1) = 0, n为奇数f(2)=1+2\times1+1 = 4, g(2)=0+2\times1+0=2f(3)=4+3\times2+2 = 12, g(3)=2+3\times2+4=12f(3)=g(3), A(n)=B(n)f(n) = g(n)$
(3)求$S_n (n\ge 3)t(n)S_nt(n+1) = t(n) + (n+1)|S| = t(n) = 2t(n) + (n+1)2^n, t(3)=24n\ge 3S_nS_n (n\ge 3)\frac{t(n)}{2}$

19.确定$f(n)f(n)f(n) = f(n-1)+2n, f(1) = 2$

20.求由0,1,2,3作成的含有偶数个0的n-可重复排列的个数。

$f(n) = 3f(n-1) + (4^n - f(n-1)), f(1) = 3$

21. $m(m\ge2)n-2a_n = (m-1)a_{n-2} + (m-2)((m-1)^{n-2} - a_{n-2}), a_1=0, a_2=m-1$

ch08Polya计数理论

Last updated: Wednesday 14 January 2026 @ 16:54:45

Contributors

转载自liuzengh/combinatorial-mathematics

1. 计算(123)(234)(5)(14)(23),并指出它所在的共轭类。

(13)(24)(5), 中型为的置换共有,

(12)(34)(5), (13)(24)(5), (14)(23)(5),
(12)(35)(4), (13)(25)(4), (15)(23)(4),
(12)(45)(3), (14)(25)(3), (15)(24)(3),
(13)(45)(2), (14)(35)(2), (15)(34)(2),
(23)(45)(1), (24)(35)(1), (25)(34)(1)
1->4->2->3
2->3->4
3->2->3->1
4->1->2

*2.求正四面体关于顶点集合{1, 2, 3, 4}的置换群

(i)不旋转,对应于恒等变换,确定出型的置换 1 个;
(ii)以顶点和相对面中心的连线为轴旋转,可旋转 120°,(1)(234)和 240°,(1)(243),确定出 型的置换 8 个;
(iii)以相对棱中点的连线为轴旋转,可旋转 180°,(12)(34), 确定出 型的置换 3 个。
综上所述,上述 12 个置换构成所求置换群。

*3.设D是n元集合,G是D上的置换群。对于D的子集A和B,如果存在使得,则称A与B是G等价的.求G的等价类的个数。

,对于 D 的子集 A,定义映射, 其中 ,则 A 与 B 是 G 等价的等同于是 G 等价的, 问题转化为则问题转化为求在$

4.对本题中顶点进行m着色,问有多少中着色方案?

$D = {1, 2, 3, 4, 5, 6, 7, 8, 9}, R = {c_1, c_2, \cdots, c_m}, F = {f | f: D\rightarrow R}G = {\sigma_I, (1357)(2468), (15)(26)(37)(48), (1753)(2864)}P_G(x_1, x_2, \cdots, x_9) = \frac{1}{4}(x_1^8 + 2x_2^4 + x_4^2)l = P_G(m, m, \cdots, m) = \frac{1}{4}(m^8 + 2m^4 + m^2)$

5. 由0, 1, 6,8,9组成的n位数,如果把一个数调转过来读得到另一个数,则称这两个数是相等的。例如0168与8910, 0890和0680是相等的。问不相等的n位数由多少个?

位置集$D = {1, 2, \cdots, n}R={c_1, c_2, c_3, c_4, c_5}F ={f|f:D\rightarrow R}G = {\sigma_I, \tau}\tau = (1, n)(2, n-1)(3, n-2) \cdots\frac{1}{2}(x^5 + x_2^{\frac{n}{2}})\frac{1}{2}(5^n + 5^{\frac{n}{2}})\frac{1}{2}(x^5 + x_2^{\frac{n-1}{2}})\frac{1}{2}(5^n + 5^{\frac{n-1}{2}})$

6. 用三色珠子串成4珠项链,要求各种颜色的珠子至少有一个。问有多少种不同的项链?

$D = {1, 2, 3, 4}, R={c_1, c_2, c_3}, F={f| f: D\rightarrow R}w(c_1)= r, w(c_2)=g, w(c_3) = bG = {\sigma_I, (1234), (13)(24), (1432), (24), (13), (12)(43), (14)(23)}P_G(x_1, x_2, x_3, x_4) = \frac{1}{8}(x_1^4 + 2x_1^2x_2 + 3x_2^2 +2x_4)x_1 = x_2 = x_3 = 3l = P_G(3, 3, 3) = \frac{1}{8}(3^4 + 2\times3^2\times3 + 3\times 3^2 + 3) = 21r^2gb, rg^2b, rgb^23\times \frac{1}{8}(\frac{4!}{2!1!1!} + 2\cdot2) = 6$

7. 把4个球a,a,b,b放入3个不同的盒子里面,求分配方案数。若不允许空盒,问有多少种分配方案?

解法1:
$D={a_1, a_2, b_1,b_2}, R={盒1, 盒2, 盒3}, F= {f|f:D\rightarrow R}G={\sigma_I, (a_1a_2), (b_1b_2), (a_1a_2)(b_1b2)}P_G(x_1, x_2, x_3, x_4)=\frac{1}{4}(x_1^4+2x_1^2x_2 + x_2^2)(ab, a, b), (bb, a, a), (aa, b, b)A_3^3 + 2\cdot\frac{3!}{2!} =12$

8.用4种颜色(红、黄、绿、蓝)对正四面体的顶点着色,求着色方案数。若要求m(m=0, 1, 2, 3, 4)个顶点为红色,求着色方案数。

$D = {1, 2, 3, 4}, R={c_1, c_2, c_3, c_4}, w(c_1)= r, w(c_2)=y, w(c_3)=g, w(c_4)=b, F = {f| f:D\rightarrow R}1^41^13^12^2P_G(x_1, x_2, x_3, x_4) = \frac{1}{12}(x_1^4 + 8x_1x_3 + 3x_2^2)x_1=x_2=x_3 =x_4 = 4\frac{1}{12}(4^4 + 8\cdot4\cdot4+3\cdot4^2) = 368 w(c_2)=y=1, w(c_3)=g=1, w(c_4)=b=1r^4, r^3, r^2, r^1, r^0$对应的系数180,132,72,36和12。

9. 证明式(8.7.2)

$F_iD\overset{\sim}G\overset{\sim}G$和G的势相同。由Burnside定理,式(8.7.2)成立。

*10. 设$s=(1234)t=(1243)g\in S_4s=g^{-1}tgS_4$共轭的。

(34), (124), (132), (1423)

from itertools import permutations
s = {1:2, 2:3, 3:4, 4:1}
t = {1:2, 2:4, 3:1, 4:3}
p = permutations([1, 2, 3, 4])
for p1 in p:
    g = { i:p1[i-1 ]for i in range(1, 5)}
    l1 = [t[g[i]] for i in range(1, 5)]
    l2 = [g[s[i]] for i in range(1, 5)]
    if l1 == l2:
        print(g)
{1: 1, 2: 2, 3: 4, 4: 3}
{1: 2, 2: 4, 3: 3, 4: 1}
{1: 3, 2: 1, 3: 2, 4: 4}
{1: 4, 2: 3, 3: 1, 4: 2}

11. 写出$S_4iZ_1 = {\sigma_I, (23), (24), (34), (234), (243)}Z_2 = {\sigma_I, (13), (14), (34), (134), (143)}Z_3 = {\sigma_I, (12), (14), (24), (124), (143)}Z_4 = {\sigma_I, (12), (13), (23), (123), (132)}$

12. 在8.5节例6中,令$w(红色)=r, w(蓝色)=b$。

(1)写出着色方案的模式表

$r^4 + r^3b + 2r^2b^2 + rb^3 + b^4$

(2)将正方形的四个顶点分别标记为1,2,3,4.则正方形的旋转群 $G= \sigma^0, \sigma^1, \sigma^2, \sigma^3\sigma = (1234)w_1 = b^4, w_2 = r^2b^2w_1, w_2\overset{\sim}Gw_1 = b^4, F_1 = {f_{16}}\overset{\sim}G = {\pi_{(1)}^{1}} = {\pi_{(2)}^{1}} = {\pi_{(3)}^{1}} = {\pi_{(4)}^{1}}, \pi_{(i)}^{1}(f_{16}) = f_{16}w_2 = r^2b^2, F_2 ={f_6, f_7, f_8, f_9, f_{10}, f_{11}}\overset{\sim}G = {\pi_{(1)}^{2}, \pi_{(2)}^{2}, \pi_{(3)}^{2}, \pi_{(4)}^{2}} = {\sigma_I, (f_6f_7f_8f_9)(f_{10}f_{11}), (f_6f_8)(f_7f_9), (f_6f_9f_8f_7)(f_{10}f_{11})}$

13.将2个红色球和2个蓝色球放在正六面体的顶点上,问有多少种不同的方案?

没有放置球的顶点的颜色统一设置为绿色。所以该问题等价于$D={1, 2, \cdots, 8}, R={c_1, c_2, c_3}, w(c_1)=r, w(c_2)=b, w(c_3)=g, F={f|f:D\rightarrow R}1\times 1^8, 8\times 1^23^2, 6\times 4^2, 9\times 2^4P_G(x_1, x_2, \cdots, x_8) = \frac{1}{24}(x_1^8 + 8x_1^2x_3^2 + 6x_4^2 + 9x_2^4)r^2g^4b^2$

14. 将8个相同的骰子堆成一个正六面体,问有多少种不同的方案?

一个骰子可以露出3个共顶点的面,相当于8种颜色的球放置在正方体的8个顶点上。所以该问题等价于$D={1, 2, \cdots, 8}, R={c_1, c_2, \cdots, c_8}, w(c_1)=r, w(c_2)=b, w(c_3)=g, F={f|f:D\rightarrow R}1\times 1^8, 8\times 1^23^2, 6\times 4^2, 9\times 2^4P_G(x_1, x_2, \cdots, x_8) = \frac{1}{24}(x_1^8 + 8x_1^2x_3^2 + 6x_4^2 + 9x_2^4)x_1=x_2=\cdots=x_8=8\frac{1}{24}(8^8 + 8^5 + 6\cdot 8^2 + 9 \cdot 8^4)$

15. 用$PolyaM={\infty\cdot a_1, \infty \cdot a_2, \cdots, \infty \cdot a_n}D={1, 2, \cdots, r}, R={a_1, a_2, \cdots, a_n}, F={f|f:D\rightarrow R}G={\sigma_I, \sigma, \sigma^2, \cdots, \sigma^{r-1}}\sigma\frac{360}{r}\sigma^i(1\le i \le r-1)r^1\phi(r)\phi(\cdot)d(d\ge2)(\frac{r}{d})^d\phi(\frac{r}{d})x_1 = x_2 = \cdots = x_r = n\phi(n)\phi(n) = n(1-\frac{1}{p_1})(1-\frac{1}{p_2}) \cdots (1-\frac{1}{p_q})\phi(1) = 1$

16. 用6种颜色涂立方体的6个面,使得每面颜色均不相同的涂法有多少种?

$D={1, 2, 3, 4, 5, 6}, R={c_1,c_2, c_3, c_4, c_5, c_6}, F = {f|f:D\rightarrow R}\sigma_I1^6180^01^22^2P_G(x_1, x_2, \cdots, x_6) = \frac{1}{4}(x_1^6 + 3x_1^2x_2^2)w_1w_2\cdots w_6\frac{1}{4}(\frac{6!}{1!1!1!1!1!1!}) = 180$

17. 在6种颜色种选取一种或多种颜色涂立方体的面,涂法有多少种?若6种颜色中有一种是红色,则有多少种涂法使得立方体中恰好有3面是红色的?

$D={1, 2, 3, 4, 5, 6}, R={c_1,c_2, c_3, c_4, c_5, c_6}, F = {f|f:D\rightarrow R}\sigma_I1^6180^01^22^2P_G(x_1, x_2, \cdots, x_6) = \frac{1}{4}(x_1^6 + 3x_1^2x_2^2)x_1 = x_2= \cdots = x_6 = mC_6^m\frac{1}{4}(m^6+3m^2m^2) = \frac{1}{4}C_6^m(m^6+3m^4)5: w_1^3w_2^3, 20:w_1^3w_2^2w_3, 10:w_1^3w_2w_3w_45\cdot \frac{1}{4}(\frac{6!}{3!3!}+3\cdot \frac{2!}{1!1!} \frac{2!}{1!1!}) + 20 \cdot \frac{1}{4}(\frac{6!}{3!2!1!} + 3\cdot \frac{2!}{1!1!} \frac{2!}{1!1!}) + 10\cdot \frac{1}{4}(\frac{6!}{3!1!1!1!}) = 40+360+300 = 700$

18. 在一个有7匹马的旋转木马上用n种颜色着色,问有多少种可供选择的方案(旋转木马只能旋转不能翻转)?

参见习题15题。

$D={1, 2, \cdots, 7}, R={c_1, c_2, \cdots, c_n}, F={f|f:D\rightarrow R}G={\sigma_I, \sigma, \sigma^2, \cdots, \sigma^{r-1}}\sigma\frac{360}{r}\sigma^i(1\le i \le 6)7^1\phi(7) = 6\phi(\cdot)\frac{1}{7}(x_1^7+6x_7)x_1 = x_2 =\cdots = x_7 = n\frac{1}{7}(6n + n^7)$

19. 给一根8尺长的棍子着色,每尺着不同的颜色,共有m种颜色可供选择。仅有的变换是翻转$180^0$,因此置换群G只有两个元素。

(1) 标出棍子的每一尺,G是什么?

$G=\sigma_I, (18)(27)(36)(45)$

(2) 给棍子着色,有多少种方案?

轮换指标$P_G(x_1, x_2, \cdots, x_8) = \frac{1}{2}(x_1^8 + x_2^4)x_1 = x_2 = \cdots = x_8 = m\frac{1}{2}(m^8 + m^4)$

(3)给三尺着蓝色,三尺着红色,两尺着绿色,有多少种着色方案?

$w_1(c_1) = r, w_2(c_2) = g, w_3(c_3) = br^3g^2b^3\frac{1}{2}\frac{8!}{3!2!3!} = 280$

(4) 给三尺着蓝色,两尺着绿色,两尺着黄色,一尺着红色,有多少种着色方案?

$w_1(c_1) = r, w_2(c_2) = g, w_3(c_3) = b, w(c_4) = yrg^2b^3y^2\frac{1}{2}\frac{8!}{3!2!2!1!} = 840$

20. 证明二维欧几里得空间的刚体旋转变换集合$T = {T_{\alpha}}T_\alpha :T={T_\alpha}$, 但是没有指明相应的二元关系。

21.证明:

(1)$A = {1, -1}1\times -1 = -1, 1\times 1 = 1, -1\times -1 = 1, -1\times 1 = 1\forall x, y \in Ax\times y \in A1, \forall x \in A, x \times 1 = x\frac{1}{x}, \forall x \in A, \exists \frac{1}{x}\in A, x\times \frac{1}{x} = 1$
(2)整数集Z在加法运算下是一个群;

封闭性: $\forall x, y \in Zx + y \in A0, \forall x \in A, x + 0 = x-x, \forall x \in A, \exists -x \in A, x + (-x) = 0$

(3) 集合$G = {0, 1, \cdots, n-1}\forall x, y \in A(x + y) , mod , n \in A0, \forall x \in A, (x + 0), mod , n = xn-x\forall x \in A-{0}, \exists n-x \in A, (x + n-x), mod , n = 0$

*补充题-Page207例7。求正方体的24个旋转也确定出6面构成的集合上的24个置换,它们的构成6次24阶置换群及型(仿照例4)

参见8.7节例2

COMP6003P计算机应用数学

Last updated: Tuesday 13 January 2026 @ 00:43:18

Contributors

COMP6004P计算机系统

Last updated: Tuesday 13 January 2026 @ 00:43:18

Contributors

COMP6101P高级计算机体系结构

Last updated: Tuesday 13 January 2026 @ 00:43:18

Contributors

COMP6102P并行算法

Last updated: Tuesday 13 January 2026 @ 00:43:18

Contributors

COMP6103P高级计算机网络

Last updated: Thursday 15 January 2026 @ 23:45:51

Contributors

分类

期末复习题型

Last updated: Thursday 15 January 2026 @ 23:45:51

Contributors

🔗高级计算机网络期末复习PPT

Fat-tree

  • Addressing
  • Two-level routing table
  • Routing algorithm
    • Pod switch: upward, downward
    • Core switch

fattree

MPTCP

  • EWTCP vs. Coupled
  • EWTCP
    • Subflows are independent
  • Coupled

BBR

  • Understand the three regions
    • Application limited
    • Bandwidth limited
    • Buffer limited
  • When packet starts to queue?
  • When packet starts to be dropped?
  • Where loss-based congestion control works?
  • Where BBR works?

PIFO

  • Start time fair queueing
  • Two flows, A and B, and , both flows have many packets arriving to the switch, no restriction on queue length, assume no dequeues and packet size is 1
    • For flow A, a0.rank=0, a1.rank=1.25, a2.rank=2.5, a3.rank=3.75, a4.rank=5, a5.rank=6.25, …
    • For flow B, b0.rank=0, b1.rank=5, b2.rank=10, …
    • The PIFO dequeue sequence is a, b, a, a, a, a, b, a, a, a, b, …

COMP6108P高级数据库系统

Last updated: Wednesday 14 January 2026 @ 18:56:21

Contributors

分类

2021-2022学年第一学期期末考试试卷

Last updated: Wednesday 14 January 2026 @ 18:36:24

Contributors

COMP6201P并行程序设计

Last updated: Tuesday 13 January 2026 @ 00:43:18

Contributors

Contributions

Last updated: Tuesday 13 January 2026 @ 02:08:05

Contributors

Test

Last updated: Tuesday 13 January 2026 @ 20:52:20

Contributors

3