回文字符串个数
给定字符串S, 对其重新排列,统计属于回文字符串的排列的个数,返回结果 mod 1000000007.
来自:hero,难度等级2 , 容易。
分析:
(1)字符串S中每个字母出现的个数,如果有2个或2个以上的字母出现的次数是奇数,则肯定不能组成回文字符串。
(2)由于回文左边和右边是一一对应关系。所以只需要统计字符串左边的个数即可。所以只需要求出左边字符的全排列个数。
(3)计算全排列
对于由 \(x_i\)个 \(a_i\) 组成的长度为n的字符串,其全排列个数 为: \begin{equation} y=\frac{n!}{x_1 ! x_2 ! x_3 ! \cdots x_k !} \label{nseq2} \end{equation}
(4)在 取模的 情况下 计算 式子 (\ref{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 \ne ((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 \)
则有:
\begin{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}
posted on 2013-11-08 17:34 Simple Love 阅读(1675) 评论(0) 编辑 收藏 举报