[第十届蓝桥杯省赛C++B组]数列求值_第十届蓝桥杯c语言b组

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6


题目来源:第十届蓝桥杯省赛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;
}

方法二:

#include<iostream>

using namespace std;

int a,b,c;
const int tlen = 10000;

int main(){
a=b=c=1;

for(int i=4;i<20190324;i+=3){
a=(a+b+c)%tlen;
b=(a+b+c)%tlen;
c=(a+b+c)%tlen;
}

cout<<c<<endl;

return 0;
}

答案

4659


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: c++