找到集合的基数

时间:2014-04-02 12:11:46

标签: algorithm

我最近遇到了以下问题:

我们有一个M个连续整数的序列A,从A [1] = 1开始: 1,2,... M(例如:M = 8,A = 1,2,3,4,5,6,7,8)

我们有一个集合T,它由从L_T连续项构成的所有可能的子序列组成。 (例子L_T = 3,子序列是{1,2,3},{2,3,4},{3,4,5},......)。我们称之为T“tiles”的元素。

我们有一个集合S,它包含长度为L_S的A的所有可能子序列。 (例如L_S = 4,子序列如{1,2,3,4},{1,3,7,8},...... {4,5,7,8})。

如果在T中存在K个瓦片,那么S的元素s可以由T的K“瓦片”“覆盖”,使得它们的项集合的并集包含s作为子集的项。例如,子序列{1,2,3}可以覆盖2个长度为2的瓦片({1,2}和{3,4}),而子序列{1,3,5}则无法覆盖“长度为2的2”瓦片,但可以覆盖长度为3({1,2,3}和{4,5,6})的2“瓦片”。

设C是S的元素的子集,可以由T的K个瓦片覆盖。

求出给定M,L_T,L_S,K的C的基数。

任何想法都将被理解如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

假设M可被T整除,因此我们有一个整数个图块覆盖初始集的所有元素(否则该语句目前不清楚)。

首先,让我们算一下F (P):它几乎是长度为L_S的子序列的数量,这些子序列可以被不超过P个图块覆盖,但不完全是这样。 形式上,F (P) = choose (M/T, P) * choose (P*T, L_S)。 我们首先精确选择P覆盖瓷砖:方式的数量为choose (M/T, P)。 修复切片后,我们可以使用P * T个不同的元素,并且有choose (P*T, L_S)个方法可以选择子序列。

嗯,这种方法有一个缺陷。 请注意,当我们选择一个图块但根本没有使用它的元素时,我们实际上不止一次地计算了一些子序列。 例如,如果我们修复了编号为2,6和7的三个图块,但只使用了2个和7个图标,那么当我们修复三个编号为2,7和其他的图块时,我们会一次又一次地计算相同的子序列。

上述问题可以通过包含 - 排除原则的变化来抵消。 实际上,对于仅使用QP个已选定图块的choose (M-Q, P-Q)个图块的子序列,它将被计为Q次,而不是仅{...} PG (P)个是固定的,但其他的是任意的。

L_S定义为长度P的子序列数,这些子序列可以由F (P)个切片覆盖。 然后,sum for Q from 0 to P是产品G (Q) * choose (M-Q, P-Q)的{​​{1}}。 从P = 0向上工作,我们可以通过计算G的值来计算F的所有值。 例如,我们从G (2)F (2)G (0)获取G (1),以及将F (2)G (0)连接起来的等式,{{1 }和G (1)

之后,答案只是值G (2)的{​​{1}}。