
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 n−1 ,S n+1 )然后我们的代码应该是
f 0 ∗ a 的 n − 1 次 方 f~0~ * a的n-1次方 f 0 ∗a的n−1次方最后的代码如下:
#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<
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月21日 19时39分04秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
解决数据库报ORA-02289:序列不存在错误
2021-05-10
map[]和map.at()取值之间的区别
2021-05-11
成功解决升级virtualenv报错问题
2021-05-11
【SQLI-Lab】靶场搭建
2021-05-11
Xception 设计进化
2021-05-11
【Bootstrap5】精细学习记录
2021-05-11
Hololens2开发笔记-捕获照片到内存并上传至服务器(unity)
2021-05-11
SkyWalking性能剖析
2021-05-11
LeetCode197.打家劫舍
2021-05-11
A simple problem HDU-2522 【数学技巧】
2021-05-11
487-3279 POJ-1022【前导0~思维漏洞】
2021-05-11
Struts2-从值栈获取list集合数据(三种方式)
2021-05-11
vue-axios的总结及项目中的常见封装方法。
2021-05-11
Linux之磁盘管理
2021-05-11
vscode中快速生成vue模板
2021-05-11
HTML5 Web Storage
2021-05-11
Ubuntu 20.10 QT 5.12.2 cannot find -lGL错误解决
2021-05-11