zoukankan      html  css  js  c++  java
  • [codevs4247]奇特的生物

    题目描述 Description

    科学家们最近发现了一种奇怪的生物,它们每天长大一岁,刚出生的宝宝为1岁,且它们的年龄没有上限。已知年龄为1岁,2岁,3岁,……,k岁的个体具有生育能力,当年龄为i的具有生育能力的个体将长大一岁时会生下ai个1岁的幼崽。假设第一天只有一个年龄为1的幼崽,现在科学家们想知道第x天年龄为y的个体有多少,但由于该物种增长速度太快,于是他们将这个任务交给了你。由于这个数可能很大,你需要对p取模。

    输入描述 Input Description

    输入数据第一行给定四个整数k,x,y,p。

    第二行包括k个整数,第i个整数代表ai。

    输出描述 Output Description

    输出数据包含一行,表示第x天年龄为y的个体的数量对p取模后的结果。

    样例输入 Sample Input

    【样例输入 1】

    3 3 1 1007

    1 1 1

    【样例输入 2】

    3 6 2 1007

    1 2 1

    样例输出 Sample Output

    【样例输出1】

    2

    【样例输出 2】

    13

    数据范围及提示 Data Size & Hint

    题目来源

      CODEVS ROUND4 月赛

    思路(官方解释)

      

    题目要求我们求第x天年龄为y的个体数量,我们可以等价为求第x-y+1天1岁的个体数量。

     

    暴力写法就是递推,我们从第一天开始算,一天一天往后推每个年龄的个体数量。

     

    这里我们可以看到有一个不足之处,我们没有必要记录年龄大于k的个体数量,因为他们没有生育能力,不会影响后面,而且我们只要求x-y+1天的1岁的个体数量。

     

    所以每一天我们都只要记录年龄为1到k的个体数量。

     

    设F[i,j]为第i天年龄为j的个体数量,初始F[1,1]=1。

     

    递推式为

    F[i+1,1]=F[i,1]+F[i,2]+……+F[i,k]

    F[i+1,j]=F[i,j-1](j>1)

     

    对于这种递推方程式固定的递推,我们可以用矩阵快速幂来加速。

    PS:如果不知道矩阵快速幂的话就看一看矩阵乘法怎么运算,然后利用矩阵乘法满足结合律,就可以用类似快速幂的方法来加速。

     

    具体做法就是用一个1*k的矩阵乘以k*k的矩阵的x-y次方,最后得到一个1*k的矩阵,这个矩阵里面就是x-y+1天1到k岁的个体数量。

     

    对于取模运算,因为我们操作的时候涉及到的运算只有加和乘,边做边取模就可以了。

     

    时间复杂度O(k^3*log(x-y))

  • 相关阅读:
    45 岁,还写代码吗?
    给你 8 个接私活的网站
    一文回顾 Java 入门知识(下)
    5 种前途迷茫的编程语言
    JVM 内存的结构模型、堆与堆栈原理、对象在内存中的结构
    mysql 索引是否能提高UPDATE,DELETE,INSERT 处理速度
    【诈尸】【游戏】多人联机游戏推荐
    250.统计同值子树
    366. 寻找二叉树的叶子节点
    156.上下翻转二叉树
  • 原文地址:https://www.cnblogs.com/yangqingli/p/4857638.html
Copyright © 2011-2022 走看看