传送门(其实就是求斐波那契数列....)

累了 明天再解释

做这道题需要一些关于矩阵乘法的基础知识。

1. 矩阵乘法的基础运算

只有当矩阵A的列数等于矩阵B的行数时,A与B可以相乘(A的行数不一定等于B的列数)。

代码实现(重载运算符):

struct matrix {
int ma[][];
};
matrix operator * (const matrix &A,const matrix &B) {
matrix C;
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
for(int k = ; k < 3; k++)
C.ma[i][j] = C.ma[i][j] + A.ma[i][k] * B.ma[k][j];
return C;
}

2. 单位矩阵

主对角线上的元素都为1,其余元素全为0的n阶矩阵称为n阶单位矩阵,记为或  
 
 
可以通过模拟推出,任何其他矩阵 * 单位矩阵 = 它本身。
 

回到这道题:

因为 f[i] = f[i-1] + f[i-2],首先构造一个矩阵 [ f[i]  f[i-1] ]

它应该等于 [ f[i-1]  f[i-2] ] * A.

由于f[i] = f[i-1] *1 + f[i-2]*1,所以矩阵A的第一列应该都为1;

f[i-1] = f[i-1] *1 + f[i-2]*0,所以第二列为1和0;

得到以下公式
可以看出,求斐波那契数列即为求刚刚推导出的这个矩阵的n次幂;
这时就可以用快速幂来解决这道题了w
void quickpow(int b) {
while(b) {
if(b & ) ans = ans * base;
base = base * base;
b >>= ;
}
} int main() {
if(n <= ) {
printf("");
return ;
}
base.a[][] = base.a[][] = base.a[][] = ;
ans.a[][] = ans.a[][] = ;
quickpow(n - );
printf("%d",ans.a[][]);
return ;
}

  

(由于fibonacci数列的前两个数字=1已经给出,矩阵(f[2],f[1])即(1,1)是已知的,所以快速幂只要进行n-2次)
求的时候ans矩阵的第一个数即为答案。
 
 
  • 一个小优化:当base自乘时,求出的数组刚好为
     
  所以只要看n-1次的base[0][0]就可以了qwq(或者n次的base[0][1])

代码如下(我做的时候没有用重载运算符而是写了个函数来实现矩阵乘法的)

#include<cstdio>
#define ll long long
using namespace std;
const ll mod = ; struct matrix {
ll ma[][];
}; matrix ans;
ll n; matrix mul(matrix A,matrix B) {
matrix C;
C.ma[][] = C.ma[][] = C.ma[][] = C.ma[][] = ;
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
for(int k = ; k < ; k++)
C.ma[i][j] += A.ma[i][k] * B.ma[k][j] % mod;
return C;
} matrix quickpow(matrix A,ll n) {
matrix B;
B.ma[][] = B.ma[][] = ;
B.ma[][] = B.ma[][] = ;
while(n) {
if(n&)B = mul(A,B);
A = mul(A,A);
n >>= ;
}
return B;
} int main() {
scanf("%lld",&n);
matrix A;
A.ma[][] = A.ma[][] = A.ma[][] = ;
A.ma[][] = ;
ans = quickpow (A,n);
printf("%lld",ans.ma[][]%mod);
return ;
}

Luogu P1962 斐波那契数列(矩阵乘法模板)的更多相关文章

  1. 斐波那契数列 矩阵乘法优化DP

    斐波那契数列 矩阵乘法优化DP 求\(f(n) \%1000000007​\),\(n\le 10^{18}​\) 矩阵乘法:\(i\times k\)的矩阵\(A\)乘\(k\times j\)的矩 ...

  2. 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

    P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...

  3. [luogu P1962] 斐波那契数列(带快速幂矩阵乘法模板)

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...

  4. 洛谷P1962 斐波那契数列(矩阵快速幂)

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...

  5. P1349 广义斐波那契数列(矩阵乘法)

    题目 P1349 广义斐波那契数列 解析 把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了 \[\begin{bmatrix}f_2\\f_1 \end{bmatrix}\begin{bmatr ...

  6. Codevs 1574 广义斐波那契数列(矩阵乘法)

    1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如an=p*an-1+q* ...

  7. [codevs]1250斐波那契数列<矩阵乘法&快速幂>

    题目描述 Description 定义:f0=f1=1, fn=fn-1+fn-2(n>=2).{fi}称为Fibonacci数列. 输入n,求fn mod q.其中1<=q<=30 ...

  8. [LUOGU] P1962 斐波那契数列

    求斐波那契第n项. [f(n-1) f(n)] * [0,1] = [f(n) f(n+1)] [1,1] 由此原理,根据矩阵乘法的结合律,用快速幂算出中间那个矩阵的n次方即可. 快速幂本质和普通快速 ...

  9. 4.17 斐波那契数列 K维斐波那契数列 矩阵乘法 构造

    一道矩阵乘法的神题 早上的时候我开挂了 想了2h想出来了. 关于这道题我推了很多矩阵 最终推出两个核心矩阵 发现这两个矩阵放在一起做快速幂就行了. 当k==1时 显然的矩阵乘法 多开一个位置维护前缀和 ...

随机推荐

  1. js 中导出excel 较长数字串会变成科学计数法

    在做项目中,碰到如题的问题.比如要将居民的信息导出到excel中,居民的身份证号码因为长度过长(大于10位),excel会自动的将过长的数字串转换成 科学计数法.现在网上找到解决方案之一: (在数字串 ...

  2. HTML 简单归纳 -- 前端知识

    web前端 Internet:是一个全球性的计算机互联网络,中文名称“因特网”.“国际互联网”.“网际网”等等: Internet提供的服务:http.ftp.Telnet.email.www.bbs ...

  3. html标签必备

    常用快捷键 Ctrl+c 复制 Ctrl+v 粘贴 Ctrl+x 剪切 Ctrl+a 全选 Ctrl+s 保存 Ctrl+z 撤销一步 Windows+d 返回桌面 Windows+e 我的电脑 Wi ...

  4. 《Inside C#》笔记(二) 初识C#

    一 程序的编译.构成 a) 编写C#代码一般用VS,但作者在这儿介绍了使用记事本编写C#代码并编译运行的过程,以便对VS有更深入的认识. 用记事本编写C#代码后,修改文本文件的后缀为.cs,然后用cs ...

  5. 原来这样就可以开发出一个百万量级的Android相机

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由QQ空间开发团队发表于云+社区专栏 最近我负责开发了一个跟Android相机有关的需求,新功能允许用户使用手机摄像头,快速拍摄特定尺寸 ...

  6. IOS 多文件上传 Java web端(后台) 使用List<MultipartFile> 接收出现的问题

    先上正确的示例: 主要是设置我们的request的content-type为multipart/form-data NSDictionary *param = @{@"assignee&qu ...

  7. (后端)Java跨域过滤器

    private FilterConfig config = null; @Override public void init(FilterConfig config) throws ServletEx ...

  8. [20171120]关于INBOUND_CONNECT_TIMEOUT设置.txt

    [20171120]关于INBOUND_CONNECT_TIMEOUT设置.txt --//上午翻看以前我的发的帖子,发现链接:http://www.itpub.net/thread-2066758- ...

  9. 洗礼灵魂,修炼python(47)--巩固篇—定义类的方法之@classmethod,@staticmethod

    定义类的方法,相信你会说,不就是在class语句下使用def () 就是定义类的方法了嘛,是的,这是定义的方法的一种,而且是最普通的方式 首先,我们已经知道有两种方式: 1.普通方法: 1)与类无关的 ...

  10. CENTOS7 SYSTEMD SERVICE 将自己的程序放入自动启动的系统服务

    1. 进入文件夹cd /usr/lib/systemd/system 2. 创建文件somed.service 3. 输入内容.如果是监控类程序,需要输入Type=forking[Unit]Descr ...