Python程序:计算从n个球中随机选择k个球后,最大值和最小值之差的总和
假设我们有n个球,用数组nums编号,数组大小为n,nums[i]表示第i个球的编号。我们还有一个值k。每次我们从n个不同的球中选择k个球,找到这k个球的最大值和最小值之差,并将差值存储在一个表中。然后将这k个球放回容器中,再次选择,直到我们选择了所有可能的组合。最后,找到表中所有差值的总和。如果答案太大,则返回结果模10^9+7。
所以,如果输入为n = 4,k = 3,nums = [5, 7, 9, 11],则输出为20,因为组合为:
- [5,7,9],差值 9-5 = 4
- [5,7,11],差值 11-5 = 6
- [5,9,11],差值 11-5 = 6
- [7,9,11],差值 11-7 = 4
所以 4+6+6+4 = 20。
为了解决这个问题,我们将遵循以下步骤:
- m := 10^9 + 7
- inv := 一个包含元素[0, 1]的新列表
- 对于 i 从 2 到 n:
- 在inv的末尾插入 (m - floor(m / i) * inv[m mod i] mod m)
- comb_count := 1
- res := 0
- 对于 pick 从 k - 1 到 n - 1:
- res := res +(nums[pick] - nums[n - 1 - pick]) * comb_count mod m
- res := res mod m
- comb_count := comb_count *(pick + 1) mod m * inv[pick + 2 - k] mod m
- 返回 res
示例
让我们来看下面的实现,以便更好地理解:
def solve(n, k, nums): m = 10**9 + 7 inv = [0, 1] for i in range(2, n + 1): inv.append(m - m // i * inv[m % i] % m) comb_count = 1 res = 0 for pick in range(k - 1, n): res += (nums[pick] - nums[n - 1 - pick]) * comb_count % m res %= m comb_count = comb_count * (pick + 1) % m * inv[pick + 2 - k] % m return res n = 4 k = 3 nums = [5, 7, 9, 11] print(solve(n, k, nums))
输入
4, 3, [5, 7, 9, 11]
输出
20
广告