CF1065E Side Transmutations 题解

题面

考虑一个字符集合\(A\)(\(A\)中元素互不相同)和一个长度为\(n\)的字符串\(S\),其中\(S\)中的字符都属于集合\(A\)。

给你一个包含 \(m\) 个整数的序列 \(b\) (\(b_1\le b_2\le\dots\le b_m\))。你可以对字符串 \(S\) 作以下的操作:

1.选择一个合法的 \(i\) ,并且令 \(k=b_i\) ;

2.取出 \(S\) 中前 \(k\) 个字符 \(Pr_k\) ;

3.取出 \(S\) 中后 \(k\) 个字符\(Su_k\) ;

4.将 \(S\) 中前 \(k\) 个字符替换成翻转后的 \(Su_k\) ;

5.将 \(S\) 中后 \(k\) 个字符替换成翻转后的 \(Pr_k\) ;

举个例子,我们令 \(S=\) "abcdefghi",\(k=2\) 。这时\(Pr_2=\) "ab",\(Su_2=\) "hi",翻转后有 \(Pr_2=\) "ba",\(Su_2=\) "ih",那么最终得到的字符串 \(S\) 就是 "ihcdefgba"。

这个操作可以被执行许多次(可能是零次),任何一个 \(i\) 也可以被使用多次。

我们将字符串 \(S\) 和 \(T\) 称为相等的字符串,当且仅当存在一个操作序列,将字符串 \(S\) 变成 \(T\)。对于上面的例子来说,"abcdefghi" 和 "ihcdefgba" 是相等的。注意到 \(S\) 和它自己也是相等的。
你的任务很简单,数出互不相同的字符串的个数。
最终的答案可能会非常大,因此你只需要输出答案 \(mod\) \(998244353\) 的结果。

题解

组合法

首先发现,\((b_{i-1},b_i]\) 这些段可以相互独立地与左边对应区间去交换,所以贡献独立
考虑其中一个长度为 \(len\) 的区间
若两边对称,方案数为 \(|A|^{len}\)
若两边不对称,方案数为 \(\frac{|A|^{len}\times (|A|^{len}-1)}{2}\)
对于中间没法变换到的自然随便选,贡献为 \(|A|^{n-2\cdot b_m}\)

Ploya

先咕着,以后填

上一篇:21.Linux中用户管理命令详解


下一篇:012 Linux 搞懂用户权限升级(sudo 和 su),包学会