我得到的数组长度为 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 进行操作吗?
答案 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)
用于所有素数p
和n
与p
互素。
因此,n^x ≡ n^(x mod (p-1)) (mod p)
现在使用Pascal的三角形或任何可能有助于计算x mod (p-1)
的东西。