我的问题。给定,我想计算有效多集S的数量。多重集S在以下情况下有效
- 的元素之和为n,并且
- 从到n的每个数字都可以唯一地表示为S的某些元素的总和。
例。 例如,如果然后{ 1 ,1 ,1 ,1 ,1 } ,{ 1 ,2 ,2 } ,{ 1 ,1 ,3 }是有效的。
然而,是无效的,因为2可以通过形成两个{ 1 ,1 }和{ 2 }(即,2可以被表示为两个2 = 1 + 1和2 = 2) ,因此第二个条件不成立。类似地3能够通过形成{ 2 ,1 }和{ 1 ,1 ,1 }。
}也无效,因为从所有数字 1至 5都可以被唯一制成,但的元素之和小号不是 5。
我试图为这个问题找到一个好的算法已经有一段时间了,但是无法解决。它来自codechef。我已经看到了一些提交的解决方案,但是仍然无法获得解决问题的逻辑。注意:问题的时限为10秒,
对于多集,我将使用符号a i < a j如果i < j,这意味着a i在多集S中出现c i次。
到目前为止,我已经得出了一些结论
- 所需的已排序多重集的第一个元素应为
- 令是一组以下两个属性然后∀ ř < ķ 一个[R + 1 = 一个ř 或 (Σ [R 我= 0一我)+ 1
- 令,其中一个我正在发生Ç 我倍,如下所要求的特性然后从上面的结论我们可以说,∀ 我一个我| n + 1和如果 Ĵ > 我。
证明:一个我+ 1 = (一个我ç 我 + 一个我 - 1 )+ 1 ⇒ 一个我| 一个我+ 1
- 现在考虑即,所有1之后的后续数字将是d的倍数。所以让f (n )是可能的此类多重集的计数,则其中,我求和的所有可能数量1'小号(=d-1)。换句话说,f(n−1)=g(n)=∑d| n,d≠ng(d)
最终,我的问题归结为这一点-有效地找到,使其不超过时间限制。