欢迎光临散文网 会员登陆 & 注册

Edu CF Round 138 D

2023-03-22 14:10 作者:露早戒絕昏睡  | 我要投稿

D. Counting Arrays

    假如我们有一个序列 a,它的长度是 n,下标是 1 到 n,现在我们可以对 a 中的元素做移除操作,需要满足的限制是如果我们要移除 a_i,需要有 gcd(a_i%2C%20i)%20%3D%201。移除一个元素之后它后面的元素要往前移动一格来填补空位。一系列移除操作会生成一个序列 b,其中 b_i 是第 i 次移除操作移除的元素的下标。举例来说,对于 a = [1, 1, 2],这个序列,如果每次都移除第一个元素,那么产生的 b = [1, 1, 1]. 一个序列 a 可以有多个移除序列 b,但是如果它只有唯一的移除序列,那么称 a 是 unambiguous 的序列,否则是 ambiguous 的序列。

    现在给定 n, m ( n%5Cle%203%20%5Ctimes%2010%5E5%2C%20m%20%5Cle%2010%5E%7B12%7D ),求满足这样的条件的 ambiguous 的序列 a 的数量: a 的长度是 1 到 n,其中的元素的取值可以是 1 到 m. 最后的答案要模 998244353


思路

    一开始我直接考虑什么样的序列是 ambiguous 的,发现有点绕,没想明白,转而考虑: 什么样的序列是 unambiguous 的,只需要用总的可能的序列数减去这个答案即可。因此问题变为: 什么样的序列是 unambiguous 的。

    注意到:%5Cforall%20n.%20gcd(n%2C1)%20%3D%201,因此,对于任意的序列 a,总是存在等长度的全为 1 的移除序列 b = [1, 1, 1, ..., 1]。如果一个序列 a 是 unambiguous 的,那么这个全 1 的移除序列 b 就是它唯一的移除序列,这要求每个元素都只能在开头被删除。现在考虑一个长为 k 的序列 a,对于其中的第 i 个元素,要让它只能在开头被删除,由于不管 a 如何,从开头删除元素总是合法的,因此原始的第 i 个元素 a_i 在到达第一个元素之前可能处于 2 到 i - 1 的任意一个位置,需要它在这些位置都不被删除,也就是 gcd(a_i%2C%20j)%20%5Cne%201%2C%20%5Cforall%20j%20%5Cin%20%5B2%2C%20i-1%5D,这要求 a_i%20能够被小于等于 i 的所有质数整除,而对于原始的 i 这个位置,这样的数的个数就是 %5Cfrac%7Bm%7D%7Bp_1%20p_2%20p_3...p_t%7D,其中 p_1%2C%20...%2C%20p_t%20是小于等于 i 的所有质数。

    由于不同位置的 i 之间选数是独立的,而不同长度的 a 属于答案的不同情况,因此前者应用乘法原理,后者应用加法原理。对于每一种长度的序列 a,把每个位置的可能取值数量撑起来,然后把每种长度的可能取值加起来,就是所有的 unambiguous 序列的数量,而所有可能的每个元素是 1 到 m ,长度是 1 到 n 的序列 a 的数量为: m%20%2B%20m%5E2%20%2B%20m%5E3%20%2B%20...%20%2B%20m%5En,只需要用前者减去后者即可得到最后的答案。由于数都很大,具体代码实现中关于模运算的细节还需要注意。


Edu CF Round 138 D的评论 (共 条)

分享到微博请遵守国家法律