

解题思路(找规律)
由题意可以做出如下图矩阵。
| 换车数n\车站 | F | G | H | A | B | C | D | E |
|---|---|---|---|---|---|---|---|---|
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 |
| 2 | 0 | 1 | 0 | 2 | 0 | 1 | 0 | 0 |
| 3 | 1 | 0 | 3 | 0 | 3 | 0 | 1 | 0 |
| 4 | 0 | 4 | 0 | 6 | 0 | 4 | 0 | 2 |
| 5 | 4 | 0 | 10 | 0 | 10 | 0 | 4 | 0 |
| 6 | 0 | 14 | 0 | 20 | 0 | 14 | 0 | 8 |
| 7 | 14 | 0 | 34 | 0 | 34 | 0 | 14 | 0 |
| 8 | 0 | 48 | 0 | 68 | 0 | 48 | 0 | 28 |
| 9 | 48 | 0 | 116 | 0 | 116 | 0 | 48 | 0 |
不难发现F列到D列是以A列为对称轴的对称矩阵,所以可以简化为如下矩阵。
| 换车数n\车站 | F | G | H | A | E |
|---|---|---|---|---|---|
| 1 | 0 | 0 | 1 | 0 | 0 |
| 2 | 0 | 1 | 0 | 2 | 0 |
| 3 | 1 | 0 | 3 | 0 | 0 |
| 4 | 0 | 4 | 0 | 6 | 2 |
| 5 | 4 | 0 | 10 | 0 | 0 |
| 6 | 0 | 14 | 0 | 20 | 8 |
| 7 | 14 | 0 | 34 | 0 | 0 |
| 8 | 0 | 48 | 0 | 68 | 28 |
| 9 | 48 | 0 | 116 | 0 | 0 |
又发现当n为奇数,E(n)必为0,所以接下来只有再另外讨论n为偶数的情况即可,当n为偶数时,不难发现E(n)=G(n-2)*2,而G(n)=F(n-1)+H(n-1)=G(n-2)+H(n-1),综上,再者为了节省空间,再将矩阵定义为二维数组简化如下。
| 行坐标 | G | H | n | E |
|---|---|---|---|---|
| 0 | 1 | 1 | 4 | 2 |
| 1 | 4 | 3 | 6 | 8 |
| 2 | 14 | 10 | 8 | 28 |
| 3 | 48 | 34 | 10 | 96 |
| 4 | 164 | 116 | 12 | 328 |
| … | … | … | … | … |
E(n)=G((n-4)/2)*2,G(n)=(G(n-1)+H(n-1))*2,H(n)=G(n-1)+H(n-1)*2,由此便可求得答案。
代码
#include <iostream>
#define M 1000
using namespace std;
int gh[5000000][2];
int main()
{
int n;
cin >> n;
if(n%2==1){
cout << 0 << endl;
}else{
gh[0][0] = gh[0][1] = 1;
int end = (n - 4) / 2;
for (int i = 1; i <= end;i++){
gh[i][0] = (gh[i - 1][0] + gh[i - 1][1]) * 2 % M;
gh[i][1] = (gh[i - 1][0] + gh[i - 1][1] * 2) % M;
}
cout << gh[end][0] * 2 % M << endl;
}
return 0;
}
博客内容探讨了一种解题策略,通过观察矩阵的对称性和递推关系简化问题。首先,矩阵的F到D列是对称的,进一步简化成以A列对称的矩阵。然后,注意到当换车数为奇数时,E列的值始终为0。对于偶数情况,发现E(n)等于G(n-2)的两倍,并通过递推公式G(n) = G(n-1) + H(n-1),H(n) = G(n-1) + H(n-1)*2来计算。博主给出了C++代码实现,用于计算给定换车数的E值。
203

被折叠的 条评论
为什么被折叠?



