zoukankan      html  css  js  c++  java
  • 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个的方案数,然后直接用矩阵快速幂搞。

  • 相关阅读:
    20200910-3 命令行和控制台编程
    C语言1作业04
    C语言1博客作业03
    c语言1博客作业02
    2018寒假作业--3抓老鼠啊~亏了还是赚了?
    2018寒假作业2--币值转换
    2018寒假作业-1 打印沙漏
    记叙在人生路上对我影响最大的三位老师
    自我介绍
    抓老鼠啊~亏了还是赚了?编程总结
  • 原文地址:https://www.cnblogs.com/Serene-shixinyi/p/8099530.html
Copyright © 2011-2022 走看看