Round #537 (Div. 2) D

题目意思:给一个长度为偶数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种,之后枚举每一种情况,预处理即可

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值