P1349 广义斐波那契数列(矩阵乘法)
Posted lykkk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1349 广义斐波那契数列(矩阵乘法)相关的知识,希望对你有一定的参考价值。
题目
解析
把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了
\[\beginbmatrixf_2\\f_1
\endbmatrix\beginbmatrix
p&q\1&0\\endbmatrix^n-2=\beginbmatrixf_n\\f_n-1
\endbmatrix\]
水题
代码
#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;
以上是关于P1349 广义斐波那契数列(矩阵乘法)的主要内容,如果未能解决你的问题,请参考以下文章