zoukankan      html  css  js  c++  java
  • 回文字符串个数

    给定字符串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}

  • 相关阅读:
    jvm的内部体系结构浅析--转
    完整java开发中JDBC连接数据库代码和步骤--转
    java语言的线程安全级别--转
    java 中hashcode 与 equals的关系
    mysql 错误 SQL Error: 1366: Incorrect string value: "xE8xAFxA6xE7xBBx86…" for column "address" a
    Linux查看CPU和内存使用情况
    5.2、访问限制
    5、面向对象编程(5.1、类和实例)
    4.5、偏函数
    4.4、装饰器
  • 原文地址:https://www.cnblogs.com/i2u9/p/full_seq.html
Copyright © 2011-2022 走看看