数组长度为k的所有子序列的元素乘积的乘积

时间:2018-07-12 07:16:18

标签: c++ arrays combinatorics subsequence

我得到的数组长度为 n 。我必须找到长度为 k 的所有子序列的元素的乘积。

例如

Array-> [1,2,3,4] n = 4, k = 2

子序列-> {1,2} {1,3} {1,4} {2,3} {2,4} {3,4}

产品-> 2 3 4 6 8 12

产品乘积2 * 3 * 4 * 6 * 8 * 12 = 13824

如果 n k 很小,这很容易做到,但是当 1 <= n <= 2000 时,我无法获得结果strong>, 1 <= k <= n 。答案可能太大,因此我们可以对答案取模 1000000007 。有人可以告诉我如何针对大型 n k 进行操作吗?

2 个答案:

答案 0 :(得分:1)

产品乘积与产品相同:(a_1 * a_2)*(a_3 * a_4)= a_1 * a_2 * a_3 * a_4。

子序列乘积的乘积可以通过幂有效地计算:(a_1 * a_2)*(a_1 * a_3)*(a_2 * a_3)= a_1 * a_1 * a_2 * a_2 * a_3 * a_3 = a_1 ** 2 * a_2 ** 2 * a_3 ** 2

找到n,包含第一个元素的子序列数。然后,以a_i ** n = a'_i的幂计算每个元素(n)。然后计算所有a'_i的乘积。

对于(a * a * a)%b =(((((a * a)%b)* a)%b)

(a * b)%c =((a%c)*(b%c))%c

答案 1 :(得分:1)

更多提示:

费马小定理状态(^表示解释)

n^(p-1) ≡ 1 (mod p)用于所有素数pnp互素。

因此,n^x ≡ n^(x mod (p-1)) (mod p)

现在使用Pascal的三角形或任何可能有助于计算x mod (p-1)的东西。