题目链接
解题思路
斐波那契数列的变形
通过递推得知,在3-12年的时候艾露猫正在成年期,每年都会生小猫,一对成年猫生一对小猫,即
c
a
t
[
i
]
=
c
a
t
[
i
−
1
]
+
c
a
t
[
i
−
2
]
cat[i] = cat[i-1]+cat[i-2]
cat[i]=cat[i−1]+cat[i−2],当年喵喵的数量是上一年喵喵的数量加上2年前的猫的数量(即为新出生的猫,两年前的猫刚刚成年生小猫);
可惜的是13年之后,艾露猫老了 不能生小猫了,我们任然按照原来的模拟,但是此时要减去多生的,那么多生了多少小猫呢?自然是13年前的那一批老了的艾露猫的数量,故而此时就要
c
a
t
[
i
]
=
c
a
t
[
i
−
1
]
+
c
a
t
[
i
−
2
]
−
c
a
t
[
i
−
13
]
cat[i] = cat[i-1]+cat[i-2]-cat[i-13]
cat[i]=cat[i−1]+cat[i−2]−cat[i−13]
这个题有一个坑点在于死亡,如果还按照原来的思路,
会写出
c
a
t
[
i
]
=
c
a
t
[
i
−
1
]
+
c
a
t
[
i
−
2
]
−
c
a
t
[
i
−
13
]
−
c
a
t
[
i
−
20
]
cat[i] = cat[i-1]+cat[i-2]-cat[i-13]-cat[i-20]
cat[i]=cat[i−1]+cat[i−2]−cat[i−13]−cat[i−20]
但是注意这显然是错误的,因为一只猫只能死一次,按照这个思路i=22的时候,第一年死的猫,第二年又死了一次,这显然是不对的,故而递推式只在
c
a
t
[
i
]
=
c
a
t
[
i
−
1
]
+
c
a
t
[
i
−
2
]
−
c
a
t
[
i
−
13
]
cat[i] = cat[i-1]+cat[i-2]-cat[i-13]
cat[i]=cat[i−1]+cat[i−2]−cat[i−13]即可,我们在输入时候判断,如果
n
>
20
n>20
n>20,就减去
c
a
t
[
i
−
20
]
cat[i-20]
cat[i−20],这样就可以避免,递推的时候,一只猫死很多次了(真以为有九条命啊
参考代码
/*
Author: 刘子明
Result: AC Submission_id: 1343276
Created at: Mon Feb 18 2019 17:41:56 GMT+0800 (CST)
Problem_id: 1430 Time: 6 Memory: 3364
*/
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
typedef long long ll;
const int mod = 10007;
int cat[50];
int main() {
#ifndef ONLINE_JUDGE
freopen("Text.txt", "r", stdin);
#else
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
#endif // !ONLINE_JUDGE
cat[1] = 2;
cat[2] = 2;
for (int i = 3; i <= 50; i++) {
cat[i] = cat[i - 1] + cat[i - 2];
if (i >= 13)
cat[i] = cat[i] - cat[i - 12];
}
int T;
cin >> T;
while (T--) {
int tmp;
cin >> tmp;
if (tmp > 20) cout << cat[tmp] - cat[tmp - 20] << "\n";
else cout << cat[tmp] << "\n";
}
return 0;
}