AcWing 1303. 斐波那契前 n 项和 快速幂+矩阵乘法
发布日期:2021-05-12 17:10:54 浏览次数:12 分类:精选文章

本文共 984 字,大约阅读时间需要 3 分钟。

大家都知道 Fibonacci 数列吧,f1=1,f2=1,f3=2,f4=3,…,fn=fn−1+fn−2。

现在问题很简单,输入 n 和 m,求 fn 的前 n 项和 Snmodm。

输入格式

共一行,包含两个整数 n 和 m。

输出格式

输出前 n 项和 Snmodm 的值。

数据范围

1≤n≤2000000000,
1≤m≤1000000010
输入样例:
5 1000
输出样例:
12

这道题我本来想用简单的暴力解决问题,但是我发现测试样例很大,我知道暴力肯定过不去,然后看y总的视频,才了解到一个交线性代数的矩阵相乘算法,我现在还在大一,我们还没开始线性代数的学习,所以我理解起来会有点很吃力,然后我就看b站的视频,但是毫无效果,然后我就对y总的代码进行了模拟,才知道了矩阵相乘的规律。

其实y总的推理古城也很复杂,这道题注定不会很简单的去解决。

所以最主要的思想是:

矩阵相乘和快速幂。

因为最后的结果是矩阵

f i [ ] = ( f   n   , f   n − 1   , S   n + 1   ) fi[ ]=(f~n~, f~n-1~ , S~n+1~) fi[]=(f n ,f n1 ,S n+1 )

然后我们的代码应该是

f   0   ∗ a 的 n − 1 次 方 f~0~ * a的n-1次方 f 0 an1

最后的代码如下:

#include
#include
#include
using namespace std;typedef long long LL;const int N=3;int n,mod;int a[N][N]={ { 0,1,0}, { 1,1,1}, { 0,0,1}};int fi[N]={ 1,1,1};void mul(int t[],int b[],int c[][N]){ int temp[N]={ 0}; for(int i=0;i
>n>>mod; n--; while(n) { if(n&1) mul(fi,fi,a); mul(a,a,a); n>>=1; } cout<
上一篇:AcWing 1226. 包子凑数 背包dp+思维
下一篇:AcWing 1220. 生命之树 树形dp

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月21日 19时39分04秒