题目描述 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))