题目来源:第十届蓝桥杯省赛C++B组
算法标签:递推
问题描述:
给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。
求第 20190324 项的最后 4 位数字。
思路:
看题肯定就是递推没跑。
for (int i = 4; i <= 20190324; i++)a[i] = (a[i-1] + a[i-2] + a[i-3]) ;
1.这道题不%10000就会数据过大,且后四位也只受到后四位的变化影响,所以我们每个数都mod10000
;
for (int i = 4; i <= 20190324; i++)a[i] = (a[i-1] + a[i-2] + a[i-3]) % 10000;
2.OJ上数组开到20190324
这种程度会出MLE
问题,所以我们不开太大的数组而只固定4个位子,把整个数列每次移动一格取四格来看
,则每次移动后,第四个是前三之和,前三个每次移动都分别变成了后一个的大小。
部分变动过程 1 1 1 3 1 1 3 5 1 3 5 9 3 5 9 17
int a[4] = { 0,1,1,1 };
a[4] = (a[3] + a[2] + a[1]) % 10000;
for (int j = 1; j <= 3; j++)a[j] = a[j + 1];
题目代码
#include <iostream>
using namespace std;
int a[4] = { 0,1,1,1 };
int main()
{
for (int i = 4; i <= 20190324; i++)
{
a[4] = (a[3] + a[2] + a[1]) % 10000;//后四位之和只与后四位有关
for (int j = 1; j <= 3; j++)a[j] = a[j + 1];//模拟后四位的前三位每次滚动增加
}
cout << a[4];
return 0;
}
答案
4659