给定字符串S, 对其重新排列,统计属于回文字符串的排列的个数,返回结果 mod 1000000007.
来自:hero,难度等级2 , 容易。
分析:
(1)字符串S中每个字母出现的个数,如果有2个或2个以上的字母出现的次数是奇数,则肯定不能组成回文字符串。
(2)由于回文左边和右边是一一对应关系。所以只需要统计字符串左边的个数即可。所以只需要求出左边字符的全排列个数。
(3)计算全排列
对于由 (x_i)个 (a_i) 组成的长度为n的字符串,其全排列个数 为: egin{equation} y=frac{n!}{x_1 ! x_2 ! x_3 ! cdots x_k !} label{nseq2} end{equation}
(4)在 取模的 情况下 计算 式子 ( ef{nseq2}) , 即求 (y\%m)
性质1:((ab)\%m = ((a\%m)(b\%m))\%m )
性质2:( a/b equiv ac pmod{m} , bc equiv 1 pmod{m} )
即 两个数相除 与 被除数和除数的乘法逆元的乘积 同余
注意: ((a/b)\%m e ((a\%m)/(b\%m))\%m )
根据性质1,我们可以不用大整数很快计算出 ( x!\%m ) 以及 ( ( x_1 ! x_2 ! x_3 ! cdots x_k !)\%m )
根据性质2,则可以计算出最后的结果
(5)求乘法逆元
费马小定理:对于素数p, 有 ( a^{p-1} equiv 1 pmod{p} )
故当m为素数时, 逆元为 ( a^{m-2} )
(6)结果
定义 函数 1: ( f(x,m) = x!\%m )
函数 2:( g(x,m) = x^{m-2} \% m )
则有:
egin{align} t_1 & = f(n,m)\ t_2 & = ( f(x_1,m) f(x_2,m) f(x_3,m) cdots f(x_k,m) )\%m\ t_3 & = g(t_2,m)\ y\%m & = {t_1}{t_2}^{m-2}\%m\ & = ({t_1}\%m)(t_2^{m-2} \% m) \% m\ & = (f(n,m)g( f(x_1,m) f(x_2,m) f(x_3,m) cdots f(x_k,m) ),m)) \% m end{align}