[矩阵乘法]裴波拉契数列III
[
矩
阵
乘
法
]
裴
波
拉
契
数
列
I
I
I
[矩阵乘法]裴波拉契数列III
[矩阵乘法]裴波拉契数列III
Description
求数列f[n]=f[n-1]+f[n-2]+1的第N项.f[1]=1,f[2]=1.
Input
n(1<n<231-1)
Output
一个数为裴波拉契数列的第n项mod 9973;
Sample Input
12345
Sample Output
8932
题目解析
对于为什么用矩阵乘法来做,详见博客斐波那契数列II
我们考虑矩阵
⊏
f
[
n
−
2
]
,
f
[
n
−
1
]
,
1
⊐
\sqsubset f[n - 2] , f[n - 1] , 1\sqsupset
⊏f[n−2],f[n−1],1⊐并利用斐波那契数列的递推关系来得到式子
⊏
f
[
n
]
,
f
[
n
−
1
]
,
1
⊐
=
⊏
f
[
n
−
2
]
+
f
[
n
−
1
]
+
1
,
f
[
n
−
1
]
,
1
⊐
\sqsubset f[n] , f[n - 1] , 1\sqsupset = \sqsubset f[n - 2] + f[n - 1] + 1, f[n - 1], 1\sqsupset
⊏f[n],f[n−1],1⊐=⊏f[n−2]+f[n−1]+1,f[n−1],1⊐
然后可以构造出一个
3
∗
3
3 * 3
3∗3的矩阵
T
T
T
∣
0
1
0
1
1
0
0
1
1
∣
\begin{vmatrix} 0 & 1 & 0 \\ 1 & 1 & 0 \\ 0 & 1 & 1 \\ \end{vmatrix}
∣∣∣∣∣∣010111001∣∣∣∣∣∣
然后可以通过
⊏
f
[
1
]
,
f
[
2
]
,
1
⊐
∗
T
=
⊏
f
[
2
]
,
f
[
3
]
,
1
⊐
\sqsubset f[1] , f[2] , 1\sqsupset * T = \sqsubset f[2] , f[3], 1 \sqsupset
⊏f[1],f[2],1⊐∗T=⊏f[2],f[3],1⊐来实现代码了
Code
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
int nt;
const int MOD = 9973;
struct matrix
{
int n, m;
int t[10][10];
}t1, t2, t3;
matrix operator *(matrix t, matrix r)
{
matrix c;
c.n = t.n, c.m = r.m;
for (int i = 1; i <= c.n; ++ i)
for (int j = 1; j <= c.m; ++ j)
c.t[i][j]=0;
for (int k = 1; k <= t.m; ++ k)
for (int i = 1; i <= t.n; ++ i)
for (int j = 1; j <= r.m; ++ j)
c.t[i][j] = (c.t[i][j] + t.t[i][k] * r.t[k][j] % MOD) % MOD;
return c;
}
void rt (int k)
{
if (k == 1)
{
t2 = t1;
return;
}
rt (k / 2);
t2 = t2 * t2;
if (k & 1) t2 = t2 * t1;
}
int main()
{
scanf ("%d", &nt);
if (nt == 1)
{
printf ("1");
return 0;
}
t3.n = 1;
t1.n = t1.m = t3.m = 3;
t1.t[1][1] = 0, t1.t[1][2] = 1, t1.t[1][3] = 0;
t1.t[2][1] = 1, t1.t[2][2] = 1, t1.t[2][3] = 0;
t1.t[3][1] = 0, t1.t[3][2] = 1, t1.t[3][3] = 1;
t3.t[1][1] = t3.t[1][2] = t3.t[1][3] = 1;
rt (nt - 1);
t3 = t3 * t2;
printf ("%d", t3.t[1][1]);
return 0;
}
[矩阵乘法]裴波拉契数列III的更多相关文章
- [矩阵乘法]裴波拉契数列II
[ 矩 阵 乘 法 ] 裴 波 拉 契 数 列 I I [矩阵乘法]裴波拉契数列II [矩阵乘法]裴波拉契数列II Description 形如 1 1 2 3 5 8 13 21 34 55 89 ...
- [矩阵乘法]斐波那契数列IV
[ 矩 阵 乘 法 ] 裴 波 拉 契 数 列 I V [矩阵乘法]裴波拉契数列IV [矩阵乘法]裴波拉契数列IV Description 求数列f[n]=f[n-2]+f[n-1]+n+1的第N项, ...
- 浅谈矩阵加速——以时间复杂度为O(log n)的算法实现裴波那契数列第n项及前n之和使用矩阵加速法的优化求法
首先请连矩阵乘法乘法都还没有了解的同学简单看一下这篇博客: https://blog.csdn.net/weixin_44049566/article/details/88945949 首先直接暴力求 ...
- 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...
- 关于斐波拉契数列(Fibonacci)
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10 ...
- 剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)
递归与循环 递归:在一个函数的内部调用这个函数. 本质:把一个问题分解为两个,或者多个小问题(多个小问题相互重叠的部分,会存在重复的计算) 优点:简洁,易于实现. 缺点:时间和空间消耗严重,如果递归调 ...
- 剑指offer三: 斐波拉契数列
斐波拉契数列是指这样一个数列: F(1)=1; F(2)=1; F(n)=F(n-1)+F(n); public class Solution { public int Fibonacci(int n ...
- e8_4输出菲波拉契数列的前10项
program fbnq;{输出菲波拉契数列的前10项} var a:..] of integer; i:integer; begin a[]:=; a[]:=; do a[i]:=a[i-]+a[i ...
- 剑指offer-面试题9.斐波拉契数列
题目一:写一个函数,输入n,求斐波拉契数列的第n项. 斐波拉契数列的定义如下: { n=; f(n)={ n=; { f(n-)+f(n-) n>; 斐波拉契问题很明显我们会想到用递归来解决: ...
随机推荐
- 微信公众号 & 付费阅读
微信公众号 & 付费阅读 付费功能 付费阅读 付费功能使用说明 1.付费功能介绍 开通了付费功能的公众号,运营者可以在编辑时对原创文章的部分或全部内容设置收费.对于付费图文,用户未付费前可免费 ...
- qt 移动窗口MoveWindow
RECT r; GetWindowRect(this->gameHwnd, &r); // 获取窗口的宽度和高度 int nWidth = r.right - r.left; int n ...
- NGK全球启动大会圆满召开,一起预见区块链的美好未来!
NGK Global全球启动大会在高新技术产业区硅谷于美国当地时间11月25日圆满召开!这次会议邀请了星盟高管.NGK全球各大市场领导人.NGK生态产业代表等上百位嘉宾出席,此次会议持续了一个多小时, ...
- [Android搞机]修改build.prop解决类原生无法链接12、13信道wifi问题
最近xda找包刷了个机,发现没法搜到12.13信道.所有未本地化的类原生都有此问题. root后打开/system/build.prop 可以用 在build.prop中加入以下几句,重启即可连接12 ...
- JDBC概念理解
##JDBC: 概念:Java DataBase Connectivity Java 数据库连接 Java语言操作数据库 JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则 ...
- where & having 关键字
where和having都是做条件筛选的 where执行的时间比having要早 where后面不能出现组函数 having后面可以出现组函数 where语句要跟在from后面 ,where 不能单独 ...
- 在vscode中用Git管理项目
1.新建仓库-->填写仓库名称-->一定要将对钩去掉-->公开-->创建 Git全局设置: git config --global --add user.name " ...
- POJ-2349(kruskal算法+最小生成树中最大边的长度)
Arctic POJ-2349 这题是最小生成树的变形题目.题目的意思是已经有s个卫星频道,这几个卫星频道可以构成一部分的网络,而且不用费用,剩下的需要靠d的卫星接收器.题目要求的就是最小生成树中,最 ...
- 通达OA 任意文件上传-2013/2015版本
参考 http://wiki.0-sec.org/0day/%E9%80%9A%E8%BE%BEoa/11.html 影响版本 2013版本 2015版本 漏洞文件 general/vmeet/wbU ...
- 进阶Java多线程
一.多线程创建方式 1.1.继承Thread类创建线程类 1.实现步骤 定义一个继承Thread类的子类,并重写该类的run()方法: 创建Thread子类的实例,即创建了线程对象: 调用该线程对象的 ...