P1349 广义斐波那契数列(矩阵乘法)
2019-08-16 07:47:57来源:博客园 阅读 ()
P1349 广义斐波那契数列(矩阵乘法)
题目
P1349 广义斐波那契数列
解析
把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了
\[\begin{bmatrix}f_2\\f_1
\end{bmatrix}\begin{bmatrix}
p&q\\
1&0\\
\end{bmatrix}^{n-2}=\begin{bmatrix}f_n\\f_{n-1}
\end{bmatrix}\]
水题
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 100;
int n, m, a1, a2, p, q;
struct matrix {
int a[N][N];
matrix() {
memset(a, 0, sizeof a);
}
void InitMatrix() {
a[1][1] = p, a[1][2] = q;
a[2][1] = 1;
}
matrix operator * (const matrix &oth) const {
matrix ans;
for (int k = 1; k <= 2; ++k)
for (int i = 1; i <= 2; ++i)
for (int j = 1; j <= 2; ++j)
ans.a[i][j] = (ans.a[i][j] + (a[i][k] * oth.a[k][j]) % m) % m;
return ans;
}
} init;
matrix qpow(matrix a, int b) {
matrix ans = init;
while (b) {
if (b & 1) ans = ans * a;
b >>= 1, a = a * a;
}
return ans;
}
template<class T>inline void read(T &x) {
x = 0; int f = 0; char ch = getchar();
for ( ; !isdigit(ch); ch = getchar()) f |= (ch == '-');
for ( ; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
x = f ? -x : x;
return;
}
signed main() {
read(p), read(q), read(a1), read(a2), read(n), read(m);
if (n <= 2) {
printf("%lld", n == 1 ? a1 : a2);
return 0;
}
init.InitMatrix();
init = qpow(init, n - 3);
printf("%lld\n", (a2 * init.a[1][1] + a1 * init.a[1][2]) % m);
return 0;
}
原文链接:https://www.cnblogs.com/lykkk/p/11173985.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 2018年湘潭大学程序设计竞赛G又见斐波那契(矩阵快速幂) 2018-09-18
- BZOJ3277: 串(广义后缀自动机) 2018-06-29
- 9-3-斐波那契查找-查找-第9章-《数据结构》课本源码-严蔚敏 2018-06-18
- C语言实现斐波那契数列(非递归) 2018-06-18
- C#求斐波那契数列第30项的值(递归和非递归) 2018-06-18
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash