3539:魔法序列的数组乘积之和(2693 分)
目录
题目
给你两个整数 M
和 K
,和一个整数数组 nums
。
seq
如果满足以下条件,被称为 魔法 序列:
seq
的序列长度为M
。0 <= seq[i] < nums.length
2seq[0] + 2seq[1] + ... + 2seq[M - 1]
的 二进制形式 有K
个 置位。
这个序列的 数组乘积 定义为 prod(seq) = (nums[seq[0]] * nums[seq[1]] * ... * nums[seq[M - 1]])
。
返回所有有效 魔法 序列的 数组乘积 的 总和 。
由于答案可能很大,返回结果对 109 + 7
取模。
置位 是指一个数字的二进制表示中值为 1 的位。
示例 1:
输入: M = 5, K = 5, nums = [1,10,100,10000,1000000]
输出: 991600007
解释:
所有 [0, 1, 2, 3, 4]
的排列都是魔法序列,每个序列的数组乘积是 1013。
示例 2:
输入: M = 2, K = 2, nums = [5,4,3,2,1]
输出: 170
解释:
魔法序列有 [0, 1]
,[0, 2]
,[0, 3]
,[0, 4]
,[1, 0]
,[1, 2]
,[1, 3]
,[1, 4]
,[2, 0]
,[2, 1]
,[2, 3]
,[2, 4]
,[3, 0]
,[3, 1]
,[3, 2]
,[3, 4]
,[4, 0]
,[4, 1]
,[4, 2]
和 [4, 3]
。
示例 3:
输入: M = 1, K = 1, nums = [28]
输出: 28
解释:
唯一的魔法序列是 [0]
。
提示:
1 <= K <= M <= 30
1 <= nums.length <= 50
1 <= nums[i] <= 108
相似问题:
分析
-
前置组合知识:
- 假设选了 a 个 0,b 个 1,c 个 2,对应的排列数为 (a+b+c)!/(a!*b!*c!)
- a+b+c 为定值 m,改写为 m!1/a!*1/b!*1/c!
- 固定 a,可以先递归得到 b 和 c 所有情况的总和,再乘以 1/a!
- 最后再乘以 m! 即可得到所有情况的总和
- 按此方式可以实现 dp 递推
-
令 dfs(i,j,k,st) 代表
- 从 [i,n] 选 j 个下标
- 还差 k 个置位
- 已选的二进制形式右移 i 位为 st 时的数组乘积总和
-
假如选取 a 个 i
- 状态转为 (i+1,j-a,k-(st+a)&1,(st+a)»1)
- 按前置知识,这个转移有 1/a!*pow(nums[i],a) 的贡献次数
-
最后再乘以 m! 即可
解答
|
|
1215 ms