2918: 【例67.2】 昆虫繁殖

内存限制:64 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:12 解决:11

题目描述

科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成虫过$x$个月产$y$对卵,每对卵要过两个月长成成虫。假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过$x$个月产卵),问过$z$个月以后共有成虫多少对?
$1≤x≤20,1≤y≤20,x< z≤50$。

输入

$x$,$y$,$z$的数值。

输出

过$z$个月以后,共有成虫对数。

样例输入 复制

1 2 8

样例输出 复制

37

提示

第1个月到8个月后(第9个月)共有成虫的对数:1 1 1 3 5 7 13 23 37

第1个月到8个月后(第9个月)新增虫卵的对数:0 2 2 2 6 10 14 26 46

每个月都有成虫产卵。

虫卵经过2个月才能变成成虫。
每个月的成虫数量是?
由前上个月的成虫和2个月之前的虫卵数量计算
每个月 (第i月)的新增的虫卵是?
由i-x个月的成虫决定(i是当前月份)
定义数组a,a[i]表示第i月昆虫成虫的数量
添加一个辅助数组b,b[i]表示第i月的新增卵的数目,从而得到两个公式:

b[i] = a[i - x] * y; (成虫经过x个月产卵 y对)

a[i] = a[i - 1] + b[i - 2]; (卵经过2个月长成成虫)

#include <iostream>

using namespace std;

int main()
{
    long long a[101]={0},b[101]={0},i,j,x,y,z;
    cin>>x>>y>>z;
    for(i=1;i<=x;i++)
    {
        a[i]=1;
        b[i]=0;
    }
    for(i=x+1;i<=z+1;i++)
    {
        b[i]=y*a[i-x];
        a[i]=a[i-1]+b[i-2];
    }
    cout<<a[z+1]<<endl;
    return 0;
}


#include<bits/stdc++.h>

using namespace std;
int x, y, n;
long long bug[105], egg[105];
long long deal(int x) {
    long long sum = 0;
    for (int i = x; i >= 1; i--) {
        sum += bug[i];
    }
    return sum;
}
int main() {
    cin >> x >> y >> n;
    bug[1] = 1;
    for (int i = 2; i <= n + 1; i++) {
        egg[i] = deal(i - x) * y;
        bug[i] = egg[i - 2];
    }
    cout << deal(n + 1);
    return 0;
}