• 51nod1196 字符串的数量


    用N个不同的字符(编号1 - N),组成一个字符串,有如下要求:
    (1) 对于编号为i的字符,如果2 * i > n,则该字符可以作为结尾字符。如果不作为结尾字符而是中间的字符,则该字符后面可以接任意字符。
    (2) 对于编号为i的字符,如果2 * i <= n,则该字符不可以作为结尾字符。作为中间字符,那么后面接的字符编号一定要 >= 2 * i。
    问有多少长度为M且符合条件的字符串,由于数据很大,只需要输出该数Mod 10^9 + 7的结果。
    例如:N = 2,M = 3。则abb, bab, bbb是符合条件的字符串,剩下的均为不符合条件的字符串。
    Input
    输入2个数,N, M中间用空格分割,N为不同字符的数量,M为字符串的长度。(2 <= N, M <= 10^6)
    Output
    输出符合条件的字符串的数量。由于数据很大,只需要输出该数Mod 10^9 + 7的结果。
    Input示例
    6 3
    Output示例
    73

    记得这道题在长沙的时候曾经rand到过(就是无聊的时候在51nod上rand题做)。

    然后清楚记得当时做不起,开题解大概懂了并没有打。

    由于N比较大,基本上搞不成什么东西,所以只能在字符串的要求上下手。

    我们发现有一个比较让人着迷的地方就是对于一个编号为i的字符如果2*i<=n,那么后面接的字符编号一定要>=2*i

    也就是说,当2*i<=n的时候i会成迅速增长,一直到2*i>n。

    那么我们可以发现两个2*i>n的i中间夹的2*i<=n的数量不超过20个。

    所以可以考虑提前预处理出中间夹x个的方案数,然后直接用矩阵快速幂搞。

  • 相关阅读:
    利用哈希map快速判断两个数组的交集
    TCP协议中的三次握手和四次挥手(图解)-转
    PC,移动端H5实现实现小球加入购物车效果
    HQL和SQL的区别
    Java泛型详解,通俗易懂只需5分钟
    经典的 Fork 炸弹解析
    Java并发之AQS详解
    Java不可重入锁和可重入锁的简单理解
    Codeforces 1215F. Radio Stations
    Codeforces 1215E. Marbles
  • 原文地址:https://www.cnblogs.com/Serene-shixinyi/p/8099530.html
Copyright © 2020-2023  润新知