计算没有连续元素的子集总数

时间:2017-06-11 15:38:41

标签: algorithm math subset

我正在尝试用组合学和计数子集解决相当复杂的问题。首先,假设我们给出了集合A = {1,2,3,... N},其中N <= 10 ^(18)。现在我们想要计算其表示中没有连续数字的子集。

示例

假设N = 3,A = {1,2,3}。总共有2 ^ 3个子集,但我们不想计算子集(1,2),(2,3)和(1,2,3)。所以总的来说这个问题我们想要回答5,因为我们只想计算剩余的5个子集。那些子集是(空子集),(1),(2),(3),(1,3)。我们还要打印结果模10 ^ 9 + 7。

到目前为止我做了什么

我在想这应该使用两个状态的动态编程来解决(我们是否采用了第i个元素),但后来我看到N可以达到10 ^ 18,所以我认为这个应该用数学公式解决。你能不能给我一些提示,我应该从哪里开始得到这个公式。

提前致谢。

1 个答案:

答案 0 :(得分:3)

在数学堆栈交换中查看How many subsets contain no consecutive elements?

他们得出的结论是,集合{1,2,3 ... n}中的非连续子集的数量是fib(n + 2),其中fib是计算数字的Fibonacci序列的函数N + 2。您对n = 3的解决方案符合此解决方案。如果你可以实现Fibonacci算法,那么你可以解决这个问题,但解决一个大到10 ^ 18的数字的问题仍然是一个挑战。

如此处的评论所述,您可以查看the fast doubling algorithm on Hacker Earth 它会在O(log n)中找到Fibonacci数。