Edu CF Round 138 D

D. Counting Arrays
假如我们有一个序列 a,它的长度是 n,下标是 1 到 n,现在我们可以对 a 中的元素做移除操作,需要满足的限制是如果我们要移除 ,需要有
。移除一个元素之后它后面的元素要往前移动一格来填补空位。一系列移除操作会生成一个序列 b,其中
是第 i 次移除操作移除的元素的下标。举例来说,对于 a = [1, 1, 2],这个序列,如果每次都移除第一个元素,那么产生的 b = [1, 1, 1]. 一个序列 a 可以有多个移除序列 b,但是如果它只有唯一的移除序列,那么称 a 是 unambiguous 的序列,否则是 ambiguous 的序列。
现在给定 n, m ( ),求满足这样的条件的 ambiguous 的序列 a 的数量: a 的长度是 1 到 n,其中的元素的取值可以是 1 到 m. 最后的答案要模 998244353

思路:
一开始我直接考虑什么样的序列是 ambiguous 的,发现有点绕,没想明白,转而考虑: 什么样的序列是 unambiguous 的,只需要用总的可能的序列数减去这个答案即可。因此问题变为: 什么样的序列是 unambiguous 的。
注意到:,因此,对于任意的序列 a,总是存在等长度的全为 1 的移除序列 b = [1, 1, 1, ..., 1]。如果一个序列 a 是 unambiguous 的,那么这个全 1 的移除序列 b 就是它唯一的移除序列,这要求每个元素都只能在开头被删除。现在考虑一个长为 k 的序列 a,对于其中的第 i 个元素,要让它只能在开头被删除,由于不管 a 如何,从开头删除元素总是合法的,因此原始的第 i 个元素
在到达第一个元素之前可能处于 2 到 i - 1 的任意一个位置,需要它在这些位置都不被删除,也就是
,这要求
能够被小于等于 i 的所有质数整除,而对于原始的 i 这个位置,这样的数的个数就是
,其中
是小于等于 i 的所有质数。
由于不同位置的 i 之间选数是独立的,而不同长度的 a 属于答案的不同情况,因此前者应用乘法原理,后者应用加法原理。对于每一种长度的序列 a,把每个位置的可能取值数量撑起来,然后把每种长度的可能取值加起来,就是所有的 unambiguous 序列的数量,而所有可能的每个元素是 1 到 m ,长度是 1 到 n 的序列 a 的数量为: ,只需要用前者减去后者即可得到最后的答案。由于数都很大,具体代码实现中关于模运算的细节还需要注意。