Good,True and Beautiful

Good Good Study, Day Day Up

导航

回文字符串个数

给定字符串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编辑  收藏  举报