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}

  • 相关阅读:
    框架Frameset 的JS 跳转 刷新 [转]
    Javascript的变量与delete操作符
    字符串替换方法的优劣
    Nutch介绍(译)
    权限系统—数据授权模型
    Apache Synapse介绍(译)
    java动态代理
    ASM简介
    maven使用技巧——构件搜索
    springSecurity源码分析——org.springframework.security.web.FilterInvocation类
  • 原文地址:https://www.cnblogs.com/i2u9/p/full_seq.html
Copyright © 2011-2022 走看看