在 0 时刻,有 1 个浮游生物。已知每经过 a 小时浮游生物会繁殖翻倍,每经过 b 小时会死亡一半的浮游生物(向上取整)。那么在 k 时刻,有多少浮游生物呢?这个结果可能很大,请将结果对 998244353 取模。代码
时间: 2024-10-04 09:02:07 浏览: 83
这个问题涉及到了动态规划中的“滚动数组”技巧,可以使用数学公式结合模运算来解决。首先我们需要确定每经过 (a + b) 的周期内浮游生物的数量变化情况。
设 T = a + b,初始数量为 P(0) = 1。每经过 T 小时,浮游生物数量先翻倍(P(T) = 2 * P(T - a)),然后死亡一半(P'(T) = floor(P(T) / 2))。为了处理死亡部分可能产生的向下取整,我们实际上需要记录每个周期结束时的上一个整数倍(即 floor(P(T))),这可以用一个变量 prev 来表示,并更新为 P'(T)。
对于第 k 个小时,我们可以找到最近的一个完整周期 j,使得 j * T <= k < (j + 1) * T。然后浮游生物的数量就是从上一个完整周期结束后到第 k 个小时这段时间内的增长加上最后一个完整周期结束时的数量。
代码示例(Python):
```python
def count_bacteria(k, a, b):
MOD = 998244353
T = a + b
P = [1] # 初始状态
prev = 1 # 上一个完整周期结束后的数量
for _ in range(1, k // T + 1): # 遍历完整周期
next_num = 2 * prev % MOD # 翻倍操作
P.append(next_num)
prev = next_num # 更新prev
if k % T > 0: # 如果k不是完整周期结束点
cycle_k = k % T
next_num = 2 * prev % MOD
P.append((next_num + prev * (1 << cycle_k) - 1) % MOD)
return P[k % T]
# 使用函数
k = 5 # 示例时刻
a = 2 # 生长时间
b = 3 # 死亡时间
result = count_bacteria(k, a, b)
```
阅读全文
相关推荐





