0106 特殊子集和三
* * * *
拉格朗日计划
* * * *
特殊子集和三

记S(A)为集合A中所有元素的和。若从$A$中任意两个非空i且不相交的子集B和C都满足

1. $S(B)\neq S(C)$。

2. 只要$|B|>|C|$,就有$S(B)>S(C)$。

则称A是一个特殊和集。

在本题中我们假定集合中有n个元素,且已知其满足条件2。利用条件2可以极大地减少验证条件1所需要的计算量,例如$n=4$时,在所有25组互不相交的子集对中只需验证1组。$n=7$时,在所有966组互不相交的子集对中只需验证70组。

当$n=12$时,在所有261625组互不相交的子集对中共有多少组需要验证?

注:本题与第103题第105题相关。

注:原题的叙述十分模糊,此处根据题意作了更详细的阐释。

本题难度:



解答

让我们先来理解题面中$n=4$时的例子。设集合中的四个元素从小到大分别是a、b、c、d且满足条件2,现考虑两个互不相交的子集A、B。

这样的子集对共有$25$组,这是因为:

若$|A|=1$,则$0 < |B| \le 3$,A共有$\binom{4}{1}=4$种取法,选定A后B可以有$2^3-1=7$种取法,总计$4\times7=28$。

若$|A|=2$,则$0 < |B| \le 2$,A共有$\binom{4}{2}=6$种取法,选定A后B可以有$2^2-1=3$种取法,总计$6\times3=18$。

若$|A|=3$,则$|B|=1$,A共有$\binom{4}{3}=4$种取法,选定A后显然B只有1种取法,总计$4\times1=4$。

此外,A、B可以交换顺序,因此共有$(28+18+4)/2=25$种情况。

若$|A|\neq|B|$,则条件2保证了$S(A)\neq S(B)$。若$|A|=|B|=1$,则由于集合中的元素各异,也无需再检验。

因此只有$|A|=|B|=2$的情况需要作计算,这样的情况共有$\binom{4}{2}/2=3$种:

若$A=\{a,b\}$、$B=\{c,d\}$,则由$a < c$, $b < d$可得$S(A)\neq S(B)$。

类似地,若$A=\{a,c\}$、$B=\{b,d\}$,则由$a < b$, $b < d$也可得$S(A)\neq S(B)$。

因此唯一需要作具体计算的只有$A=\{a,d\}$、$B=\{b,c\}$一种情况。

同样地,对$n=12$的情况,找出所有满足$|A|=|B|=k$且互不相交的子集A、B,其中k在2到6之间。将A、B中元素各自从小到大排序为$a_1,\ldots,a_k$以及$b_1,\ldots,b_k$,若$a_i < b_i$对$i=1,\ldots,k$都成立或$a_i > b_i$对$i=1,\ldots,k$都成立则无需检验,否则需要作具体计算。

按上述方式统计后将结果除以$2$ (因为A、B可以交换顺序)即得结果$21384$。

import itertools

n=12

s=0
for k in range(2,n/2+1):
    for choice in itertools.combinations(range(n),2*k):
        for a_ in itertools.combinations(choice, k):
            a=sorted(list(a_))
            b=sorted([i for i in choice if i not in a])
            if not (all(a[i] < b[i] for i in range(k)) or all(a[i] > b[i] for i in range(k))):
                s+=1

print s/2