写在前面

最近做了一些题目, 才发现当初学习组合数学时候还是做的题太少, 很多东西只是知道其概念如何, 真正上手题目还是get不到精髓. 这次来总结一下计算不定方程解的个数的一些方法, 加深一下对这块知识点的掌握.

问题

求解不定方程中解的个数, 这里面的不定方程指的是形如下面的方程:
x1+x2+⋯+xn=k,xi∈Z,(i=1,2,⋯,n).x_1+x_2+\cdots+x_n=k, \quad x_i\in \mathbb{Z},(i=1,2,\cdots, n). x1​+x2​+⋯+xn​=k,xi​∈Z,(i=1,2,⋯,n).
对于这样的方程, 其组合意义很容易与球盒模型进行对应, 即将kkk个相同的球放入nnn个不同的盒子的方法数(注意到xix_ixi​可以取负数, 所以球盒模型只能解释xix_ixi​为非负整数的情形).

我们要求上述方程中解的个数, 一个直观的思路是通过枚举来计算, 但是这不是一个一般的方法, 下面通过介绍一些简单的组合学知识来进一步分析计算不定方程解的个数.

知识点回顾

这里需要先来看看关于组合中 重集的组合,容斥原理的知识, 其中容斥原理是方便计算不定元范围有上界的情形.

重集的组合

N={k1a1,k2a2,⋯,knan},(有重数限制)M={∞⋅a1,∞⋅a2,⋯,∞⋅an},(无重数限制)\begin{aligned} N&=\{k_1a_1,k_2a_2,\cdots,k_na_n\}, &(有重数限制)\\ M&=\{\infty\cdot a_1,\infty\cdot a_2,\cdots,\infty\cdot a_n\}, &(无重数限制)\\ \end{aligned} NM​={k1​a1​,k2​a2​,⋯,kn​an​},={∞⋅a1​,∞⋅a2​,⋯,∞⋅an​},​(有重数限制)(无重数限制)​

定义: 重集MMM的一个k−k-k−组合BBB, 就是一个M[k]M[k]M[k]到{a1,a2,⋯,an}\{a_1,a_2,\cdots,a_n\}{a1​,a2​,⋯,an​}的映射BBB.

几种等价形式:

  1. φ:{a1,a2,⋯,an}→{0,1,2,⋯}\varphi:\{a_1,a_2,\cdots,a_n\}\to\{0,1,2,\cdots\}φ:{a1​,a2​,⋯,an​}→{0,1,2,⋯}, 且∑i=1nφ(ai)=k\sum_{i=1}^n\varphi(a_i)=k∑i=1n​φ(ai​)=k.这样的映射全体与MMM 的k−k-k−组合一一对应.
  2. 不定方程x1+x2+⋯+xn=kx_1+x_2+\cdots+x_n=kx1​+x2​+⋯+xn​=k其中xix_ixi​为非负整数. 方程的解集合与重集MMM的k−k-k−组合一一对应.
  3. 球盒模型, kkk个相同的球放入nnn个不同的盒子的不同放法数.

定理: 重集的k−k-k−组合数为
⟨nk⟩=⟨n⟩kk!=(n+k−1k).\left\langle\begin{matrix}n\\k \end{matrix}\right\rangle=\frac{\langle n\rangle_k}{k!}=\binom{n+k-1}{k}. ⟨nk​⟩=k!⟨n⟩k​​=(kn+k−1​).

证明: (方法一: 用递推关系证明)

设T(n,k)T(n,k)T(n,k)表示不定方程x1+x2+⋯+xn=kx_1+x_2+\cdots+x_n=kx1​+x2​+⋯+xn​=k的非负整数解的个数, 则方程的解可分为两种形式:

  1. x1=0x_1=0x1​=0, 即x2+x3+⋯+xn=kx_2+x_3+\cdots+x_n=kx2​+x3​+⋯+xn​=k的非负整数解, 共有T(n−1,k)T(n-1,k)T(n−1,k)个;
  2. x1⩾1x_1\geqslant1x1​⩾1, 令x1′=x1−1⩾0x_1'=x_1-1\geqslant0x1′​=x1​−1⩾0, 方程的解等价于x1′+x2+⋯+xn=k−1x_1'+x_2+\cdots+x_n=k-1x1′​+x2​+⋯+xn​=k−1的非负整数解, 共有T(n,k−1)T(n, k-1)T(n,k−1)个;

于是有T(n,k)=T(n−1,k)+T(n,k−1)T(n,k)=T(n-1,k)+T(n, k-1)T(n,k)=T(n−1,k)+T(n,k−1).

又有初始值T(n,0)=1,T(1,k)=1T(n,0)=1, T(1, k)=1T(n,0)=1,T(1,k)=1(可以通过生成函数来求出T(n,k)T(n,k)T(n,k)


⟨nk⟩=(n+k−1k),\left\langle\begin{matrix}n\\ k \end{matrix}\right\rangle=\binom{n+k-1}{k}, ⟨nk​⟩=(kn+k−1​),
也满足上述递推关系以及初值, 所以:

⇒T(n,k)=(n−k+1k).\Rightarrow T(n,k)=\binom{n-k+1}k. ⇒T(n,k)=(kn−k+1​).


方法二: 从球盒模型组合意义出发证明, kkk个相同的球放入nnn个不同的盒子中.

nnn个盒子并排放, 共有n−1n-1n−1条公共边.

n−1n-1n−1条公共边和kkk个球共占用n+k−1n+k-1n+k−1个位置.

每一种放法对应于从n+k−1n+k-1n+k−1个位置中选n−1n-1n−1个位置作为盒子的公共边.

于是共有(n+k−1n−1)=(n+k−1k)\binom{n+k-1}{n-1}=\binom{n+k-1}k(n−1n+k−1​)=(kn+k−1​)种方法.


方法三:(用隔板法证明)

kkk个相同的球放入nnn个不同的盒子, 且每个盒子至少1个球(隔板问题)

即从kkk个球中间的k−1k-1k−1个位置选择n−1n-1n−1位置中放置隔板,共有(k−1n−1)\binom{k-1}{n-1}(n−1k−1​)种.

对应不定方程x1+x2+⋯+xn=kx_1+x_2+\cdots+x_n=kx1​+x2​+⋯+xn​=k的正整数解的个数.

而所求为x1+x2+⋯+xn=kx_1+x_2+\cdots+x_n=kx1​+x2​+⋯+xn​=k的非负整数解的个数, 转化为正整数解,等价于
x1′+x2′+⋯+xn′=k+n(xi′=xi+1)x_1'+x_2'+\cdots+x_n'=k+n\quad(x_i'=x_i+1) x1′​+x2′​+⋯+xn′​=k+n(xi′​=xi​+1)
的正整数解的个数:(n+k−1n−1)=(n+k−1k)\binom{n+k-1}{n-1}={n+k-1\choose k}(n−1n+k−1​)=(kn+k−1​).

容斥原理

定理(包含排除原理)
设SSS为一个有限集, Pi(1≤i≤m)P_i(1\le i\le m)Pi​(1≤i≤m)为mmm个性质,

  • Ai={x∣x∈S,x具有性质Pi}A_i=\{x|x\in S, x具有性质P_i\}Ai​={x∣x∈S,x具有性质Pi​},
  • Aˉi={x∣x∈S,x不具有性质Pi}\bar A_i=\{x|x\in S, x不具有性质P_i\}Aˉi​={x∣x∈S,x不具有性质Pi​}.

  • Aˉ1∩Aˉ2∩⋯∩Aˉm={x∣x∈S,且x不具有Pi中任何性质}\bar A_1\cap\bar A_2\cap\cdots\cap\bar A_m=\{x|x\in S, 且x不具有P_i中任何性质\}Aˉ1​∩Aˉ2​∩⋯∩Aˉm​={x∣x∈S,且x不具有Pi​中任何性质};
  • A1∪A2∪⋯∪Am={x∣x∈S,且x具有全部性质}A_1\cup A_2\cup\cdots\cup A_m=\{x|x\in S, 且x具有全部性质\}A1​∪A2​∪⋯∪Am​={x∣x∈S,且x具有全部性质}.

SSS中不具有任何性质的元素个数为
∣Aˉ1∩Aˉ2∩⋯∩Aˉn∣=∣S∣−∑1⩽i⩽m∣Ai∣+∑1⩽i<j⩽m∣Ai∩Aj∣−∑1⩽i<j<k⩽m∣Ai∩Aj∩Ak∣+⋯+(−1)m∣A1∩A2∩⋯∩Am∣.\begin{aligned} |\bar A_1\cap\bar A_2\cap\cdots\cap\bar A_n|=|S|&-\sum_{1\leqslant i\leqslant m}|A_i|+\sum_{1\leqslant i<j\leqslant m}|A_i\cap A_j|\\ &-\sum_{1\leqslant i<j<k\leqslant m}|A_i\cap A_j\cap A_k|+\cdots\\ &+(-1)^m|A_1\cap A_2\cap\cdots\cap A_m|. \end{aligned} ∣Aˉ1​∩Aˉ2​∩⋯∩Aˉn​∣=∣S∣​−1⩽i⩽m∑​∣Ai​∣+1⩽i<j⩽m∑​∣Ai​∩Aj​∣−1⩽i<j<k⩽m∑​∣Ai​∩Aj​∩Ak​∣+⋯+(−1)m∣A1​∩A2​∩⋯∩Am​∣.​

证明:

要证明定理成立, 只需证明SSS中任意元素在等式两边被计算的次数相等.

  1. xxx不具有任何性质(x∉S)(x\notin S)(x∈/​S), 则1=1−0+0⋯+(−1)m01=1-0+0\cdots+(-1)^m01=1−0+0⋯+(−1)m0,成立;

  2. yyy具有ttt个性质, 1≤t≤m1\le t\le m1≤t≤m, y∈Sy\in Sy∈S, 则
    0=1−(t1)+(t2)−(t3)+⋯+(−1)t(tt)=(1−1)t,0=1-\binom t1+\binom t2-\binom t3+\cdots+(-1)^t\binom tt=(1-1)^t, 0=1−(1t​)+(2t​)−(3t​)+⋯+(−1)t(tt​)=(1−1)t,
    显然成立. 证完.

不定元有下界的整数解个数

这类问题比较简单, 上面的重集组合部分已经讨论了, 直接代入公式就可以计算, 下面以一个例题来进行讲解.

x1+x2+x3+x4=9x_1+x_2+x_3+x_4=9x1​+x2​+x3​+x4​=9,其中
{x1≥1,x2≥2,x3≥1,x4≥3,\begin{cases}x_1\geq 1,\\x_2\geq 2,\\x_3\geq 1,\\x_4\geq 3,\end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧​x1​≥1,x2​≥2,x3​≥1,x4​≥3,​
的整数解的个数.

令y1=x1−1y_1=x_1-1y1​=x1​−1, y2=x2−2y_2=x_2-2y2​=x2​−2, y3=x3−1y_3=x_3-1y3​=x3​−1, y4=x4−3y_4=x_4-3y4​=x4​−3.

则上述方程等价于y1+y2+y3+y4=9−7=2y_1+y_2+y_3+y_4=9-7=2y1​+y2​+y3​+y4​=9−7=2的非负整数解的个数.

由重集MMM的k−k-k−组合数⇒(4+2−12)=(52)=10\Rightarrow {4+2-1\choose 2}={5\choose2}=10⇒(24+2−1​)=(25​)=10.

不定元任意范围的整数解个数

求不定方程
x1+x2+x3=9,1≤x1≤3,2≤x2≤4,0≤x3≤5,x_1+x_2+x_3=9,\quad 1\le x_1\le3,2\le x_2\le 4,0\le x_3\le5, x1​+x2​+x3​=9,1≤x1​≤3,2≤x2​≤4,0≤x3​≤5,
的整数解的个数.

解: 令y1=x1−1,y2=x2−2,y3=x3y_1=x_1-1,y_2=x_2-2,y_3=x_3y1​=x1​−1,y2​=x2​−2,y3​=x3​, 原不定方程可以等价于求解
y1+y2+y3=6,0≤y1≤2,0≤y2≤2,0≤y3≤5,y_1+y_2+y_3=6,\quad 0\le y_1\le2,0\le y_2\le 2,0\le y_3\le5, y1​+y2​+y3​=6,0≤y1​≤2,0≤y2​≤2,0≤y3​≤5,
的整数解的个数, 令SSS为方程y1+y2+y3=6y_1+y_2+y_3=6y1​+y2​+y3​=6的非负整数解, 则
∣S∣=(3+6−16)=(86)=28.|S|=\binom{3+6-1}{6}=\binom86=28. ∣S∣=(63+6−1​)=(68​)=28.
令P1P_1P1​为性质y1≥3y_1\ge 3y1​≥3, P2P_2P2​为性质y2≥3y_2\ge3y2​≥3, P3P_3P3​为性质y3≥6y_3\ge6y3​≥6, AiA_iAi​表示满足性质PiP_iPi​的解构成 的集合i=1,2,3i=1,2,3i=1,2,3,
∣Aˉ1∩Aˉ2∩Aˉ3∣=28−(3+3−13)∗2−1+1+0∗2−0=8.|\bar A_1\cap\bar A_2\cap\bar A_3|=28-\binom{3+3-1}3*2-1+1+0*2-0=8. ∣Aˉ1​∩Aˉ2​∩Aˉ3​∣=28−(33+3−1​)∗2−1+1+0∗2−0=8.

当然, 如果不用容斥原理, 也可以通过生成函数的方法进行计算, 下面具体说说.

直接设不定方程
x1+x2+x3=k,x_1+x_2+x_3=k, x1​+x2​+x3​=k,
整数解个数为aka_kak​, 则容易得到aka_kak​的生成函数为:
g(x)=(x+x2+x3)(x2+x3+x4)(1+x+⋯+x5)=x3(1+x+x2)2(1+x+⋯+x5)=x12+3x11+6x10+8x9+9x8+9x7+8x6+6x5+3x4+x3\begin{aligned} g(x) &=(x+x^2+x^3)(x^2+x^3+x^4)(1+x+\cdots+x^5)\\ &=x^3(1+x+x^2)^2(1+x+\cdots+x^5)\\ &=x^{12}+3 x^{11}+6 x^{10}+8 x^9+9 x^8+9 x^7+8 x^6+6 x^5+3 x^4+x^3 \end{aligned} g(x)​=(x+x2+x3)(x2+x3+x4)(1+x+⋯+x5)=x3(1+x+x2)2(1+x+⋯+x5)=x12+3x11+6x10+8x9+9x8+9x7+8x6+6x5+3x4+x3​
于是直接得到a9=8a_9=8a9​=8.

计算不定方程解的个数的方法汇总相关推荐

  1. python解多元多次方程组_多元一次不定方程解的个数

    #!/usr/bin/python3.6 # -*- coding: utf-8 -*- """ 多元一次不定方程解的个数 problem1: 将30条鱼放入10个桶中, ...

  2. HDU 5201 The Monkey King 组合数+不定方程解的个数

    题意:链接 方法:组合数+不定方程解的个数 解析: 毒瘤题,好难啊,刷一个我就不想再刷另外两个了 这玩意的话,后俩先不看. 先看前两个. 前两个是啥意思呢. 不妨考虑一下挡板法. 这里我举一个某篇我想 ...

  3. 多元一次不定方程解的个数

    链接:https://ac.nowcoder.com/acm/contest/553/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  4. 关于不定方程解的个数的问题

    不定方程的解的个数 Lv0   首先我们看这样一个问题,求 ∑ i = 1 n x i = b \sum\limits_{i = 1}^n x_i = b i=1∑n​xi​=b 的非负整数解的个数. ...

  5. 关于“100g文件全是数组,取最大的100个数”解决方法汇总

    原题如下: 有一个100G大小的文件里存的全是数字,并且每个数字见用逗号隔开.现在在这一大堆数字中找出100个最大的数出来. 我认为,首先要摸清考官的意图.是想问你os方面的知识,还是算法,或者数据结 ...

  6. 【组合数学】生成函数 ( 使用生成函数求解不定方程解个数 )

    文章目录 一.使用生成函数求解不定方程解个数 1.带限制条件 2.带系数 参考博客 : [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与 ...

  7. 求解多元一次方程解的个数(参考内容)

    1.整数多元一次不定方程的矩阵解法与程序设计 2.欧几里得算法(含严谨证明) 3.扩展欧几里得算法(含严谨证明) 4.多元一次不定方程解的个数 但只有系数是1的时候才可以排列组合..我们要解决的是系数 ...

  8. 隔板法求解不定方程x1+x2+x3=5解的个数

    隔板法求解不定方程的解的个数 文章目录 隔板法求解不定方程的解的个数 1.求正整数解的个数--普通隔板法 2.求非负整数解的个数--添加元素隔板法 1.求正整数解的个数--普通隔板法 将不定方程想象成 ...

  9. 【组合数学】生成函数 ( 使用生成函数求解不定方程解个数示例 2 | 扩展到整数解 )

    文章目录 一.使用生成函数求解不定方程解个数示例 参考博客 : [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 | 与多 ...

最新文章

  1. Python 位运算符
  2. 简单的Java处理事务
  3. Compass 编译.scss文件的问题
  4. pycharm如何修改默认浏览器?修改成chrome
  5. .Net缓存小结(中)
  6. 一次合同违约复盘(一)
  7. VMware下安装CentOS7 无法通过桥接模式进行联网
  8. resolve fire在SAP UI5中的使用场景
  9. 对称二叉树Python解法
  10. Ubuntu13.10上android+idea+scala+sbt环境搭建
  11. 把CNN里的乘法全部去掉会怎样?华为提出移动端部署神经网络新方法
  12. flex----其他交互设计
  13. movelast对数据记录数有要求吗_客户验厂,电脑坏了,考勤记录数据可以自动生成找回来吗?...
  14. C++基础之布尔类型,什么是C++的布尔类型
  15. 路由器交换机[置顶] 路由器和交换机的综合实验⑵
  16. 关于 笔记本换掉光驱加装全新SSD以及win10系统无损迁移到SSD 详细教程
  17. 微博简单的免登陆获取
  18. 集线器和交换机的区别 傻傻分不清
  19. tp框架中构造函数__construct()与初始化函数_initialize()的区别
  20. object has no attribute 'cleaned_data'

热门文章

  1. java代码实现导出Excel表格、工具ssm框架、maven、idea
  2. break 和 continue 语句, 以及循环中的 else 子句
  3. 比特币交易(Transaction)的输入与输出
  4. Flask之Flask实例有哪些参数
  5. Python -- 数据加载、存储与文件格式
  6. 如何在Eclipse中添加Servlet-api.jar的方法
  7. zabbix利用mutt和msmtp配置邮件报警
  8. 七步从Angular.JS菜鸟到专家(1):如何开始【转】
  9. php大文件下載,使用apache/nginx x-sendFile模塊替換
  10. k-means算法实现python