[

]

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}

∣∣∣∣∣∣​010​111​001​∣∣∣∣∣∣​
然后可以通过

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;
}

最新文章

  1. Linux进程间通信(八):流套接字 socket()、bind()、listen()、accept()、connect()、read()、write()、close()
  2. C++联合
  3. hdu 4826(dp + 记忆化搜索)
  4. PHP注册手机获取验证码代码
  5. angularjs + seajs构建Web Form前端(二)
  6. Hadoop第11周练习—HBase基础知识
  7. Http方法:Get请求与Post请求的区别
  8. 小巧实用js倒计时
  9. BootStrap入门教程 (四) :JQuery类库插件(模态窗口,滚动监控,标签效果,提示效果,“泡芙”效果,警告区域,折叠效果,旋转木马,输入提示)
  10. oracle 将科学计数法数据转换为非科学计数法数据
  11. IFrame 根据嵌入页面自动调节大小
  12. ffplay常用命令
  13. JMeter Ultimate Thread Group阶梯式减压
  14. 《程序设计入门——C语言》翁恺老师 第二周编程练习记录
  15. Eclipse在线集成SpringBoot
  16. Java面试2018常考题目汇总
  17. 集合之HashSet(含JDK1.8源码分析)
  18. DIV+CSS兼容解决DIV最大宽度和最小宽度问题
  19. NOI前训练日记
  20. hdu 4747 mex 线段树+思维

热门文章

  1. Netty &amp; websockets
  2. virtual scroll list / dynamic dom list
  3. VAST维萨币二月发行,高倍币重现江湖!
  4. NGK全球启动大会正式启动,资产上链的前景与机会在哪?
  5. CAD颜色对照表
  6. 手把手教你Spring Boot整合Mybatis Plus 代码生成器
  7. 解决使用Redis时配置 fastjson反序列化报错 com.alibaba.fastjson.JSONException: autoType is not support
  8. 【译】Rust宏:教程与示例(一)
  9. kali 下的邮件发送工具 swaks
  10. Course2.1 Graph Paper Programming