解题思路(找规律)
由题意可以做出如下图矩阵。
换车数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;
}