子集总数

时间:2013-03-16 21:43:51

标签: algorithm

我对这个问题感到好奇..

您可以从集合P = {1,2,3,.. n}中选择多少个子集?子集S应满足以下条件:

当您选择x(x∈P,x是集合P的元素)来创建S时,您不能为S选择* x和b * x。

约束:

1 <= n <= 1000
2 <= a < b <= n
b % a != 0 ( b is not divisible by a)

示例:

n = 3 , a = 2, b = 3
so total subsets are 5 ,i.e, {}, {1}, {2}, {3}, {2, 3} 
as if in a particular subset there is 1 so 1*2 = 2 and 1*3 cant be there.
so {1,2}, {1,3} and {1,2,3} can't be there

2 个答案:

答案 0 :(得分:1)

<强>更新

这与OEIS(在线整数序列百科全书)中的 sequence A051026 : Number of primitive subsequences of {1, 2, ..., n} 有关。

我认为没有任何简单的方法来计算这些条款。即使递归计算也不是微不足道的,除非n是素数,其中:

a(n) = 2 * a(n-1) - 1

这里的问题和“A051026”都可以被认为是上述序列概括的子问题。 “A051026”是(a,b,..) = (2,3,4,5...)的实例,例如“所有整数&gt; = 2”。

答案 1 :(得分:0)

我相信计算互补更容易 - 即不允许的S子集数量。这是S的子集数量,每个子集至少有一对(a,b)a除以b。在你计算出这个数字之后,M'只是从2个 n 的S子集总数中减去它。

现在要计算不允许S的子集数量,您必须应用inclusion-exclusion principle。解决方案不是很容易实现,但我认为没有替代方法。