提示 1: 考虑直接暴力的复杂度如何?(有
提示 2: 上述复杂度应该优化掉哪一个维度?因为各个城市之间相互的影响作用不好刻画,$m$ 部分难以优化。于是
提示 3: 由于复杂度中
提示 4: 被点亮的情况很多,但是不被点亮的情况很容易刻画,考虑计算不被点亮的概率。
欸,看提示喔。
根据提示,我们考虑将期望拆分为概率之和,并反向计算不被点亮的概率。而这只需要计算在所有
一个城市不被点亮有何要求呢?
第
这些条件是越来越弱的,因此从前往后考虑。假设距离为
我们先看第
第
第
……
使用上述逻辑,每一次的方案使用乘法原理相乘,即可得到所有方案数,进而计算得到概率。其相邻两项只相差了
当然,中间有可能出现没灯可选的情况,此时直接退出循环即可(也可以不退出,因为更新的答案已经是
将上述计算的概率加总即可,时间复杂度为
def main():
n, m = MII()
dist = [LII() for _ in range(n)]
mod = 998244353
cnt = [0] * n
inv = 1
for i in range(1, n + 1):
inv *= i
inv %= mod
inv = pow(inv, -1, mod)
ans = 0
for i in range(m):
for j in range(n):
if dist[j][i] >= 2:
cnt[dist[j][i] - 2] += 1
cur = 1
cur_cnt = 0
for j in range(n - 1, -1, -1):
cur_cnt += cnt[j]
cur *= cur_cnt
cur %= mod
cur_cnt -= 1
for j in range(n):
cnt[j] = 0
ans = (ans + 1 - cur * inv) % mod
print(ans)