Project Euler 106
Project Euler 106
题目
Special subset sums: meta-testing
Let $S(A)$ represent the sum of elements in set $A$ of size $n$. We shall call it a special sum set if for any two non-empty disjoint subsets, $B$ and $C$, the following properties are true:
- $S(B) \neq S(C)$; that is, sums of subsets cannot be equal.
- If $B$ contains more elements than $C$ then $S(B) > S(C)$.
For this problem we shall assume that a given set contains n strictly increasing elements and it already satisfies the second rule.
Surprisingly, out of the $25$ possible subset pairs that can be obtained from a set for which $n = 4$, only $1$ of these pairs need to be tested for equality (first rule). Similarly, when $n = 7$, only $70$ out of the $966$ subset pairs need to be tested.
For $n = 12$, how many of the $261625$ subset pairs that can be obtained need to be tested for equality?
NOTE: This problem is related to Problem 103 and Problem 105.
解决方案
由于已经假定了集合$A$已经满足了第二个条件,因此,只需要考虑两个集合$B,C$大小相同($|B|=|C|=k$)时的情形。
容易发现,不需要求和的情形是:对于 $\forall i:1\leq i\leq k$,$B$中的第$i$小元素都小于(或大于)$C$中的第$i$小元素。在最后得出需要求和的时候,需要将这部分情形减去,留下的则计入答案。
因此,首先需要从$A$中选取$2k$个元素,其中$k$个分给$B$集合,另外$k$个分给$C$。由于$B,C$的先后不需要关心,因此一共有$\dfrac{\binom{2k}{k}}{2}$种分法。
下一个问题的正式描述:已知集合中有$2k$个不同的元素,其中$k$个分给$B$集合,另外$k$个分给$C$。(不失一般性,)对于 $\forall i:1\leq i\leq k$,$B$中的第$i$小元素都小于$C$中的第$i$小元素,有多少种划分方法?
为解决这个问题,先以一个例子说明:
设$k=3$,那么就将$1\sim 6$这$6$个数进行放入集合$B$和$C$中。
如果第$i$个数放入$B$中,那么字符串第$i$位记为左圆括号’(‘,否则记为右圆括号’)’。
那么有$5$种方法:
| 括号字符串 | $B$ | $C$ |
|---|---|---|
| ()()() | ${1,3,5}$ | ${2,4,6}$ |
| ()(()) | ${1,3,4}$ | ${2,5,6}$ |
| (())() | ${1,2,5}$ | ${3,4,6}$ |
| ((())) | ${1,2,3}$ | ${4,5,6}$ |
| (()()) | ${1,2,4}$ | ${3,5,6}$ |
每个括号字符串对应着一种分配方法。可以发现这个括号字符串有一下特点:
- 左圆括号和右圆括号的数量相等
- 每个字符串的前缀中,左圆括号的数量不会少于右圆括号。这也就说明了,$B$中的每一个数,$C$中总有更大的数和它们一一对应。
符合这种特征的字符串的个数,称为卡特兰数,在OEIS中为A000108。第$n$项为$C(n)=\dfrac{\binom{2n}{n}}{n+1}$。
综上所述,答案为:
代码
1 | from tools import C |