Martian148's blog Martian148's blog
首页
  • ICPC 算法笔记
  • ICPC 算法题解
  • 体系结构
  • 高等数学
  • 线性代数
  • 概率论与数理统计
  • 具体数学
  • Martian148的奇思妙想
  • 游记
  • 通识课笔记
关于
  • useful 网站
  • 友情链接
  • 分类
  • 归档

Martian148

一只热爱文科的理科生
首页
  • ICPC 算法笔记
  • ICPC 算法题解
  • 体系结构
  • 高等数学
  • 线性代数
  • 概率论与数理统计
  • 具体数学
  • Martian148的奇思妙想
  • 游记
  • 通识课笔记
关于
  • useful 网站
  • 友情链接
  • 分类
  • 归档
  • 高等数学

  • 线性代数

  • 概率论与数理统计

  • 具体数学

    • 第一章:递归问题
      • 河内塔问题
      • 平面上的直线
      • 约瑟夫问题
        • 递归表达式
        • 二进制形式性质
        • 成套方法
        • 推广的约瑟夫递归式
    • 第二章:和式
    • 第三章:整值函数
  • 数学建模

  • 数学
  • 具体数学
martian148
2024-08-03
目录

第一章:递归问题

# 河内塔问题

image.png|496

有 333 根柱子和 nnn 个圆盘,我们可以把最顶上的圆盘移到另外的柱子上,但不可以把大的圆盘放在小的圆盘上面

问,最少需要多少步才能把所有圆盘从一根柱子移到另外一跟柱子上

我们先命名一个状态 TnT_nTn​ 表示圆盘从一根柱子移动到另外一根柱子的最少次数

那么我们思考一种移动方案,假设我们要把圆盘从 AAA 柱移动到 BBB 柱上

那么我们可以将 n−1n-1n−1 个圆盘移动 CCC 柱上 然后把最下面的圆盘移动到 BBB 柱上,最后把 n−1n-1n−1 个圆盘从 CCC 柱移到 BBB 柱,所以,我们能得到方程

T=1Tn=2Tn−1+1(n>0) \begin{aligned} &T=1 \\ &T_n= 2T_{n-1}+1 (n >0) \end{aligned} ​T=1Tn​=2Tn−1​+1(n>0)​

我们想要得到通项公式,可以盲猜结论 Tn=2n−1,n≥0T_n = 2^n -1,n \ge 0Tn​=2n−1,n≥0

可以用数学归纳法证明

  • n=1n=1n=1 时等式成立
  • n≥1n\ge 1n≥1时,假设 Tn−1=2n−1−1T_{n-1} = 2^{n-1}-1Tn−1​=2n−1−1 成立,可得
Tn=2Tn−1+1=2×(2n−1−1)+1=2n−1 T_n=2T_{n-1}+1=2 \times (2^{n-1}-1)+1=2^n-1 Tn​=2Tn−1​+1=2×(2n−1−1)+1=2n−1

证毕

# 平面上的直线

平面上 nnn 条直线所界定的区域最大个数 LnL_nLn​ 是多少

image.png

我们考虑假设已经有n−1n-1n−1 条直线,我们需要画一条直线,这条直线最多和 n−1n-1n−1 条直线相交产生 nnn 个新的区域

image.png

所以我们得到了

L0=1Ln=Ln−1+n(n>0)\begin{aligned} &L_0=1 \\ &L_n=L_{n-1}+n (n >0) \end{aligned}​L0​=1Ln​=Ln−1​+n(n>0)​

很容易我们可以得出 Ln=n(n+1)2+1,n≥0L_n=\frac{n(n+1)}{2}+1,n \ge0Ln​=2n(n+1)​+1,n≥0

考虑一个变形,平面上由 nnn 条这样的折线所界定区域的最大的个数 ZnZ_nZn​ 是多少

image.png|443

考虑一个折线可以看作两条直线擦掉一半,对于每个折线,我们都失去了 222 块区域

image.png

所以

Zn=L2n−2n=2n(2n+1)2+1−2n=2n2−n+1,n≥0 \begin{aligned} Z_n & = L_{2n}-2n \\ & = \frac{2n(2n+1)}{2}+1-2n\\ & = 2n^2-n+1,n \ge 0 \end{aligned} Zn​​=L2n​−2n=22n(2n+1)​+1−2n=2n2−n+1,n≥0​

# 约瑟夫问题

从围成标有记号的 111 到 nnn 的 nnn 个人开始,每隔一个删去一个人,直到有一个人幸存下来

image.png

n=10n=10n=10 时,消去的人时 2,4,6,8,10,7,1,92,4,6,8,10,7,1,92,4,6,8,10,7,1,9 最后 555 幸存

我们由此能得到几个规律:

  • 每一轮杀人,杀一半,向下取整,偶数编号的人会被杀
  • 幸存的人,重新编号

# 递归表达式

每轮杀人,编号减半,那么最后肯定剩下一个人,我们能不能从第 kkk 轮活下来的那个人的编号反推出第 k−1k-1k−1 轮活下来的那个人的编号呢?

设 nnn 个人时的幸存的号码为 J(n)J(n)J(n)

先考虑偶数的情况,第一圈把偶数的去掉,奇数留下来,假设一开始有 2n2n2n 个人,第一轮后就是

image.png

所以我们得到了一个子问题,用递归的思想,假设子问题以及求解完成了,我们可以得到表达式 J(2n)=2J(n)−1,n≥1J(2n)=2J(n)-1,n\ge1J(2n)=2J(n)−1,n≥1,也就是说,存活的那个人的编号是子问题的答案的编号的两倍减一

然后考虑奇数,对于 2n+12n+12n+1 个人

image.png

我们得到 J(2n+1)=2J(n)+1J(2n+1)=2J(n)+1J(2n+1)=2J(n)+1

所以我们得到了表达式

J(1)=1J(2n)=2J(n)−1,n≥1J(2n+1)=2J(n)+1,n≥1 \begin{aligned} J(1)&=1 \\ J(2n)&=2J(n)-1,n\ge 1\\ J(2n+1)&=2J(n)+1,n\ge 1 \end{aligned} J(1)J(2n)J(2n+1)​=1=2J(n)−1,n≥1=2J(n)+1,n≥1​

我们通过这个式子就可以快速得到答案了

接下来尝试把递归式子转化为非递归的形式

# 二进制形式性质

有了递归式,我们能做出一张表:

image.png

显然可以看出,J(n)J(n)J(n) 按照 2m2^m2m 为分段,段内为一个等差数列,于是我们能写出 J(n)J(n)J(n) 的封闭形式,设 n=2m+ln=2^m+ln=2m+l,则:

J(2m+l)=2l+1,m≥0,0≤l<2J(2^m+l)=2l+1,\ m\ge 0,\ 0\le l<2J(2m+l)=2l+1, m≥0, 0≤l<2

我们把 nnn 转化成二进制会发现更多规律,不妨设 n=(bmbm−1⋯b1b0)n=(b_mb_{m-1}\cdots b_1b_0)n=(bm​bm−1​⋯b1​b0​)

由于首位字母 bmb_mbm​ 必为 111,所以 n=(1bm−1⋯b1b0)n=(1b_{m-1}\cdots b_1b_0)n=(1bm−1​⋯b1​b0​),那么 l=(bm−1⋯b1b0)l=(b_{m-1}\cdots b_1b_0)l=(bm−1​⋯b1​b0​)

所以 J(n)=2l+1=(bm−1bm−2⋯b01)=(bm−1bm−2⋯b0bm)J(n)=2l+1=(b_{m-1}b_{m-2}\cdots b_01)=(b_{m-1}b_{m-2}\cdots b_0b_m)J(n)=2l+1=(bm−1​bm−2​⋯b0​1)=(bm−1​bm−2​⋯b0​bm​)

用计算机程序设计的行话说就是,nnn 向左循环移动一位就得到 J(n)J(n)J(n)

# 成套方法

我们尝试把 JJJ 函数进行拓展,有一个类似于 JJJ 的递归式,引入常数 α\alphaα

f(1)=αf(2n)=2f(n)+β,n≥1f(2n+1)=2f(n)+γ,n≥1 \begin{aligned} f(1)&=\alpha \\ f(2n)&=2f(n)+ \beta ,n\ge 1\\ f(2n+1)&=2f(n)+\gamma ,n\ge 1\\ \end{aligned} f(1)f(2n)f(2n+1)​=α=2f(n)+β,n≥1=2f(n)+γ,n≥1​

我们可以构造出如下表:

image.png|243

可以观察出 α\alphaα 的系数是不超过 nnn 的 222 的最大幂,β\betaβ 的系数递减 111 ,γ\gammaγ 的系数递增 111

我们可以得到 f(n)f(n)f(n) 的封闭形式:

f(n)=A(n)α+B(n)β+C(n)γ f(n)=A(n)\alpha+B(n)\beta+C(n)\gamma f(n)=A(n)α+B(n)β+C(n)γ

且我们观察出

A(n)=2mB(n)=2m−1−lC(n)=l \begin{aligned} A(n) &= 2^m \\ B(n) &=2^m-1-l \\ C(n) &=l \\ \end{aligned} A(n)B(n)C(n)​=2m=2m−1−l=l​

这里可以使用数学归纳法证明,但是也可以采用特殊值法来证明,书上把这种方法称为成套方法

由于 A(n),B(n),C(n)A(n),B(n),C(n)A(n),B(n),C(n) 的关系在任何情况下都是固定的,所以理论上来说 α,β,γ\alpha,\beta,\gammaα,β,γ 可以取任意值

不妨取 (α,β,γ)=(1,0,0)(\alpha,\beta,\gamma)=(1,0,0)(α,β,γ)=(1,0,0),f(n)=A(n)f(n)=A(n)f(n)=A(n),由:

f(1)=1f(2n)=2f(n),n≥1f(2n+1)=2f(n),n≥1 \begin{aligned} f(1)&=1 \\ f(2n)&=2f(n),n\ge 1 \\ f(2n+1)&=2f(n),n\ge 1 \\ \end{aligned} f(1)f(2n)f(2n+1)​=1=2f(n),n≥1=2f(n),n≥1​

很显然可以得到 A(n)=f(n)=2mA(n)=f(n)=2^mA(n)=f(n)=2m

我们还可以设 f(n)=1f(n)=1f(n)=1,有:

1=α1=2×1+β1=2×1+γ \begin{aligned} 1&=\alpha \\ 1&=2\times 1+\beta \\ 1&=2\times1 + \gamma \end{aligned} 111​=α=2×1+β=2×1+γ​

解出来得到 (α,β,γ)=(1,−1,−1)(\alpha,\beta,\gamma)=(1,-1,-1)(α,β,γ)=(1,−1,−1),于是得到了一个关系式 1=A(n)−B(n)−C(n)1=A(n)-B(n)-C(n)1=A(n)−B(n)−C(n)

然后设 f(n)=nf(n)=nf(n)=n,有:

1=α2n=2n+β2n+1=2n+γ \begin{aligned} 1&=\alpha \\ 2n&=2n+\beta \\ 2n+1&=2n+\gamma \end{aligned} 12n2n+1​=α=2n+β=2n+γ​

解出来得到 (α,β,γ)=(1,0,1)(\alpha,\beta,\gamma)=(1,0,1)(α,β,γ)=(1,0,1),于是得到了一个关系式 n=A(n)+C(n)n=A(n)+C(n)n=A(n)+C(n)

联立三个式子:

1=A(n)−B(n)−C(n)n=A(n)+C(n)A(n)=2m \begin{aligned} 1&=A(n)-B(n)-C(n) \\ n&=A(n)+C(n) \\ A(n)&=2^m \end{aligned} 1nA(n)​=A(n)−B(n)−C(n)=A(n)+C(n)=2m​

于是 B(n)=2m−1−l,C(n)=lB(n)=2^m-1-l,C(n)=lB(n)=2m−1−l,C(n)=l 就可以被解出来了,这就是成套方法

有多少个独立的参数,我们就需要多少个特殊的值,本题中有三个 (α,β,γ)(\alpha,\beta,\gamma)(α,β,γ)

# 推广的约瑟夫递归式

前面我们得到了一个二进制下循环移位的性质,那么推广的约瑟夫表达式是否也有类似的性质呢?

推广的递归式的形式如下:

f(1)=αf(2n+j)=2f(n)+βj,j=0,1,n≥1 \begin{aligned} f(1)&=\alpha \\ f(2n+j)&=2f(n)+\beta_j\ ,\ j=0,1\ ,n\ge 1 \\ \end{aligned} f(1)f(2n+j)​=α=2f(n)+βj​ , j=0,1 ,n≥1​

展开就是

f((bmbm−1…b0)2)=2f((bmbm−1…b2)2)+βb0=4f((bmbm−1…b2)2)+2βb1+βb0⋮=2mf((bm)2)+2m−1βbm−1+⋯+2βb1+βb0=2mα+2m−1βbm−1+⋯+2βb1+βb0. \begin{aligned} f((b_m b_{m-1} \dots b_0)_2) =& 2f((b_m b_{m-1} \dots b_2)_2) + \beta_{b_0} \\ =& 4f((b_m b_{m-1} \dots b_2)_2) + 2\beta_{b_1} + \beta_{b_0} \\ \vdots \\ =& 2^m f((b_m)_2) + 2^{m-1} \beta_{b_{m-1}} + \cdots + 2\beta_{b_1} + \beta_{b_0} \\ = &2^m \alpha + 2^{m-1} \beta_{b_{m-1}} + \cdots + 2\beta_{b_1} + \beta_{b_0}. \end{aligned} f((bm​bm−1​…b0​)2​)==⋮==​2f((bm​bm−1​…b2​)2​)+βb0​​4f((bm​bm−1​…b2​)2​)+2βb1​​+βb0​​2mf((bm​)2​)+2m−1βbm−1​​+⋯+2βb1​​+βb0​​2mα+2m−1βbm−1​​+⋯+2βb1​​+βb0​​.​

所以我们可以解除二进制的限制,这里的 bib_ibi​ 一点是 0,10,10,1 ,但 βj\beta_jβj​ 可以不为 0,10,10,1

f((bmbm−1⋯b1b0)2)=(αβbm−1βbm−2⋯βb1βb0)2. f\left((b_m b_{m-1} \cdots b_1 b_0)_2\right) = (\alpha \beta_{b_m-1} \beta_{b_{m-2}} \cdots \beta_{b_1} \beta_{b_0})_2. f((bm​bm−1​⋯b1​b0​)2​)=(αβbm​−1​βbm−2​​⋯βb1​​βb0​​)2​.

我们把上面的表格换一种形式就可以看出

image.png|260

完全符合上面的形式,这里的 β=β0,α=γ\beta = \beta_0, \alpha = \gammaβ=β0​,α=γ

于是,我们可以考虑推广基数,这里我们设基数为 ddd

f(j)=αj,1≤j<d;f(dn+j)=cf(n)+βj,0≤j<d,n≥1 \begin{aligned} f(j) &= \alpha_j, \quad 1 \leq j < d; \\ f(dn + j) &= c f(n) + \beta_j, \quad 0 \leq j < d, \quad n \geq 1 \end{aligned} f(j)f(dn+j)​=αj​,1≤j<d;=cf(n)+βj​,0≤j<d,n≥1​

这个的解是:

f((bmbm−1⋯b1b0)d)=(αbmβbm−1βbm−2⋯βb1βb0)c f\left((b_m b_{m-1} \cdots b_1 b_0)_d\right) = (\alpha_{b_m} \beta_{b_{m-1}} \beta_{b_{m-2}} \cdots \beta_{b_1} \beta_{b_0})_c f((bm​bm−1​⋯b1​b0​)d​)=(αbm​​βbm−1​​βbm−2​​⋯βb1​​βb0​​)c​

例如,我们有递归式:

f(1)=34;f(2)=5;f(3n)=10f(n)+76,n≥1;f(3n+1)=10f(n)−2,n≥1;f(3n+2)=10f(n)+8,n≥1; \begin{aligned} f(1) &= 34; \\ f(2) &= 5; \\ f(3n) &= 10f(n) + 76, \quad n \geq 1; \\ f(3n + 1) &= 10f(n) - 2, \quad n \geq 1; \\ f(3n + 2) &= 10f(n) + 8, \quad n \geq 1; \end{aligned} f(1)f(2)f(3n)f(3n+1)f(3n+2)​=34;=5;=10f(n)+76,n≥1;=10f(n)−2,n≥1;=10f(n)+8,n≥1;​

假设我们这里要计算 f(19)f(19)f(19),有 d=3d=3d=3 ,c=10c=10c=10 ,我们可以把 191919 转化成三进制 (201)3(201)_3(201)3​ ,这里的 α1=2,β0=76,beta1=−2\alpha_1=2,\beta_0=76,beta_1=-2α1​=2,β0​=76,beta1​=−2,所以 f(19)=f((201)3)=(576−2)10=500+760−2=1258f(19)=f((201)_3)=(5\ 76\ -2)_{10}=500 + 760 - 2 = 1258f(19)=f((201)3​)=(5 76 −2)10​=500+760−2=1258

上次更新: 2025/04/08, 18:03:31
概率论与数理统计笔记
第二章:和式

← 概率论与数理统计笔记 第二章:和式→

最近更新
01
Java基础语法
05-26
02
开发环境配置
05-26
03
pink 老师 JavaScript 学习笔记
05-26
更多文章>
Theme by Vdoing | Copyright © 2024-2025 Martian148 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式