计算不定方程的等式方程非负整数解的组数
问题描述
对于不定方程(a_1 + a_2 + a_3 + ... + a_k = g),求解该不定方程正整数解的组数
eg: (k = 3, g = 4)时,(①1 + 1 + 2 = 4 ②1 + 2 + 1 = 4 ③2 + 1 + 1 = 4),所以此时是三组解
问题分析
问题可等效为求解将(g)个小球分成(k)组的方案数
解决方法为隔板法。(g)个小球共(g-1)个间隔,(k-1)个隔板可以分为(k)个部分,在(g-1)个间隔中放置(k-1)个隔板的方案数即为答案
隔板法能够运用的前提条件为保证(a_i)为非负整数,这样使用隔板划分出的数据才是合法的。假设(a_i)可能为负数或0,使用隔板是无法得到对应数据的
代码实现
仅需要实现组合数的计算,具体内容见组合数的代码实现
例题
计算不定方程的不等式方程非负整数解的组数
问题描述
(y_1 + y_2 + y_3 + ... + y_k leq g)
(y_i geq 1)
求符合条件的(y_i)的解的组数
问题分析
对于等式(y_1 + y_2 + y_3 + ... + y_k = g),求解方法可以采用隔板法,这是在上面讨论过的
假设我们目前仅考虑(=)的情况,只需在(g-1)个间隔中放置(k-1)个隔板,从而构成k个数
接着考虑(<)的情况,此时形成的k个数需要小于g,即g个球中有未进入分组的,在(g-1)个间隔中放置(k)个隔板,这样构成的(k+1)个分组中最后一组就相当于未进入分组的,前k个数的和就(<g)了
综合考虑以上两种情况,最终策略为在(g-1)个间隔加上最后的位置中放置(k)个隔板。当隔板全部处于中间(g-1)个位置时,对应的是(<)的情况;当最后一个隔板处于最后的位置时,中间(g-1)个间隔中还是(k-1)个隔板,对应的是(=)的情况。
代码实现
同样仅需要实现组合数的计算,,具体内容见组合数的代码实现