最近玩埙,是一个十孔树脂竹形埙,有箫的基础,上手就能吹响,看着指法表就能吹曲。 埙指法怪异、音域有限,但是便携,总的来说还是能玩的。
回想箫指法是自己推演的,埙也应如此。 计算得知十孔有 1024 种组合,这也太多了。 偶然看到一个 B站视频讲到「埙是闭口乐器,音高与孔的位置无关,只与开孔面积有关。」这是宝贵的经验。 观察十孔埙,发现有 4 种尺寸:1微3小3中3大。这种情况刚好应用前面研究「质因数幂积」问题得到的结论,共有 128 种组合。 早上想起这个问题,发现如果十孔各不相同得到 1024 种组合也是符合该结论的。
至此,关于埙的问题抽象为纯数学问题。 这一大类问题目的就是为了「数数」,核心是「计数原理」,包括加法原理和乘法原理。 (代数数据类型 ADT 也是计数原理的应用)
组合可以看做将一堆东西分成两堆,选取其中一堆,因此天然存在对称性,例如10选3等于10选7。 如果每个元素各不相同,可以看作每个元素都是一个类别。 (相同有两种含义:同一个、同一类,一般指同一类) 这样就与前面的「质因数幂积」问题联系起来了。 现在新的问题是指定选取的元素个数,有多少种组合?例如十孔埙开 5 个孔有几种指法?
这个问题使用枚举法研究,得到以下组合,汇总得到结果 1+4+9+16+22+24+22+16+9+4+1=128 符合
| |
另外一种思路是从上至下分解,将问题记作
N|(n0,n1,...)
分解为子问题
M1|(n1,...) + M2|(n1,...) + ...
编写 Python 程序计算并验证通过:
| |
构思许多,落于实处遗失许多,不再多言。
EOF