动态规划--数列求值(蓝桥填空题)

目录:

              【题目描述】

              【AC代码】

              【作者思路】

              【关于取mod】

              【作者闲话】

【题目描述】

给定数列 1,1,1,3,5,9,17,⋯从第 4 项开始,每项都是前 33项的和。求第 20190324 项的最后 4 位数字。

【AC代码】

#include <bits/stdc++.h>//答案4659
using namespace std;
const int N=3e7;//因为要求到第20190324项
long long int arr[N];//开个大数组
int main()
{
	arr[1]=1;//初始化数组前四项
	arr[2]=1;
	arr[3]=1;
	arr[4]=3;
	for(int i=5;i<=20190324;i++)
	{
		arr[i]=arr[i-1]+arr[i-2]+arr[i-3];//和斐波那契数列类似的动态规划
		arr[i]%=1000000;//一定要取模不然会爆long long
	}
	cout<<arr[20190324];//输出所有值,接着复制最后四位作为填空题答案提交
	return 0;
}

【作者思路】

这是一题相对经典的动态规划,题目中已经给出转移方程,易错点在于取模

【关于取mod】

 (a+b) mod⁡ p=(a mod⁡ p+b mod⁡ p)mod⁡ p,两数相加取余等于两数取余再相加再取余,这是取余的基本性质,这就是为什么每一步都取mod但最后不会影响结果(即后四位数字)的准确性。

本题中所mod p,p不能太小,p如果太小则输出结果少于四位数字,读者可以自行尝试mod 10,100等

a-b同样也满足取余性质,(a−b) mod p=(a mod p−b mod p+ p) mod p

a*b同样适用,(a×b) mod p=(a mod p)×(b mod p) mod p

幂也能取余,a的b次方mod p=(a mod p)的b次方 mod p

但是a/b不满足,不能适用

【作者闲话】

此篇取mod感谢luogu @Tomle,对博主的解答

欢迎各位dalao指出错误,提问,博主(bme专业)一定尽力解答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值