题目意思:给一个长度为偶数n的字符串s,字符串s有大小写的英文字母。再给你一个询问次数q,每个询问有两个数字x,y,表示s[x]和s[y]及其所有相同的字符放在一个集合里面而且长度是n/2(不够用其他字符来凑),其他的放在另一个集合里面(长度为n/2)。两个集合里面字符的顺序不同视为一种排列。两个集合交换为止视为不同的排列。
然后,根据每个询问问,问有效的排列数目是多少。
思路(根据官方题解):
1.我们想到s最多有52种字符(小写26+大写26),统计每个字符出现的次数,保存在数组cnt里面
2.我们假设划分一个集合(长度n/2),里面有k种字符,分别是a1,a2..ak,每种字符的数目是cnt[a1],cnt[a2]....cnt[ak]。这个时候,有多少种排列?由不全相异元素全排列可知,由 (n/2)!/(cnt[a1]!*cnt[a2]!*...*cnt[ak]! )种
3.我们已经划分好了一个集合,那么剩下的字符就自然归属于另一个集合了,而且数目是(n/2)! / (cnt[b1]! * cnt[b2]!...*)
4.那么总的排列数是两个集合数目的乘积,是(n/2)! *(n/2)! / (cnt['a']! *cnt['b']* ...*cnt['Z']) === >注意到这是一个常量(对每一个x和y来说)
5.怎么计算? (1)先算阶乘取模 (2)再算阶乘对998244353的逆元 (3)逆元+阶乘取模得到
6.因为最多有52种字符,所以不同的(x,y)最多有52*52 = 2704种,之后枚举每一种情况,预处理即可