1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| import math
def get_M(C, R): """ 计算携带上限为 C 时,通过 R 个房间所需的最小初始卡片数。 我们采用反推法:从最后一个房间往回推到初始分发机。 """ cards_needed = 1 for _ in range(R): if cards_needed <= C - 1: cards_needed += 1 else: num_trips = math.ceil((cards_needed - (C - 1)) / (C - 2)) cards_needed = num_trips * 2 + 1 + cards_needed return cards_needed
def solve(c_start, c_end, r_target): total_sum = 0 for c in range(c_start, c_end + 1): m_val = get_M(c, r_target) total_sum += m_val return total_sum
print(f"M(3,6): {get_M(3, 6)}") print(f"M(4,6): {get_M(4, 6)}")
result = solve(3, 40, 30) print(f"ΣM(C, 30) for 3 <= C <= 40 is: {result}")
|