目录:
【题目描述】
【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专业)一定尽力解答