解题报告

直接递推时间复杂度是 \(O(n)\) 的,会超时。由于是递推求解,考虑矩阵加速递推。

原递推式 \(a_n=a_{n-1}+a_{n-2}\) 写成矩阵递推形式为:

\[\begin{bmatrix} a_n & a_{n-1} \end{bmatrix} = \begin{bmatrix} a_{n-1} & a_{n-2}\end{bmatrix} \times A = … = \begin{bmatrix} a_{2} & a_{1}\end{bmatrix} \times A^{n-2}
\]

其中 \(A\) 是 \(2 \times 2\) 的矩阵,也就是转移矩阵。求解出 \(A\) 就可以利用矩阵快速幂解决本题。

设 \(A\) 为 \(\begin{bmatrix} a & b \\ c & d \end{bmatrix}\),利用第一个等式,我们可以得出以下式子:

\[\begin{cases}
a_3=p\times a_2+q\times a_1=a\times a_2+c\times a_1\\
a_2=b\times a_2 + d\times a_1\\
a_2=p\times a_1+q\times a_0=a\times a_1+c\times a_0\\
a_1=b\times a_1+d\times a_0

\end{cases}\]

这些式子分别用 \(n=3,n=2\) 代入矩阵获得。

将 \(a_0=0\) 代入式子,解得 \(a=p,b=1,c=q,d=0\)。则 \(A\) 为 \(\begin{bmatrix} p & 1 \\ q & 0 \end{bmatrix}\)。\(\begin{bmatrix} a_{2} & a_{1}\end{bmatrix} \times A^{n-2}\) 的第一行第一个数就是 \(a_n\)。当然,如果 \(n\le 2\) 要特判。

最后矩阵快速幂求解即可,时间复杂度 \(O(\log n)\)。

参考代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
template <typename T>
inline void read(T &x){char c;x=0;int fu=1;c=getchar();while(c>57||c<48){if(c==45){fu=-1;}c=getchar();}while(c<=57&&c>=48){x=(x<<3)+(x<<1)+c-48;c=getchar();}x*=fu;}
template <typename T>
inline void write(T x){if(x<0){putchar(45);x=-x;}if(x>9){write(x/10);}putchar(x%10+48);}
int p, q, a1, a2, n, m;
struct MATRIX {
int mp[3][3];
}A, Ans;
MATRIX operator * (const MATRIX& X, const MATRIX& Y) {
MATRIX res; memset(res.mp, 0, sizeof(res.mp));
for(int i = 1; i <= 2; i++) {
for(int j = 1; j <= 2; j++) {
for(int k = 1; k <= 2; k++) {
res.mp[i][j] = (res.mp[i][j] + (X.mp[i][k] * Y.mp[k][j] % m)) % m;
}
}
}
return res;
}
void qpow(MATRIX a, int p) {
while(p) {
if(p & 1) Ans = Ans * a;
a = a * a;
p >>= 1;
}
return;
}
signed main(){
read(p), read(q), read(a1), read(a2), read(n), read(m);
if(n == 1) return !printf("%lld", a1);
if(n == 2) return !printf("%lld", a2);
A.mp[1][1] = p, A.mp[1][2] = 1, A.mp[2][1] = q, A.mp[2][2] = 0;
Ans.mp[1][1] = a2, Ans.mp[1][2] = a1;
qpow(A, n - 2);
write(Ans.mp[1][1] % m);
return 0;
}

题解:P1349 广义斐波那契数列的更多相关文章

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

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

  2. P1349 广义斐波那契数列(矩阵加速)

    P1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如an=pan-1+qan-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an ...

  3. 洛谷P1349 广义斐波那契数列(矩阵快速幂)

    P1349 广义斐波那契数列 https://www.luogu.org/problemnew/show/P1349 题目描述 广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列.今给定 ...

  4. 洛谷——P1349 广义斐波那契数列(矩阵加速)

    P1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如$an=p\times a_{n-1}+q\times a_{n-2}$?的数列.今给定数列的两系数$p$和$q$,以及数列的最前两项 ...

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

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

  6. 洛谷——P1349 广义斐波那契数列

    题目描述 广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an除以m的余数. 输入输出格 ...

  7. P1349 广义斐波那契数列

    题目描述 广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an除以m的余数. 输入输出格 ...

  8. Luogu P1349 广义斐波那契数列

    解题思路 既然广义斐波那契,而且数据范围这么大,那么我们使用矩阵快速幂来进行求解.大家都知道斐波那契的初始矩阵如下 $$\begin{bmatrix}1&1\\1&0\end{bmat ...

  9. 洛谷P1349 广义斐波那契数列

    传送门 话说谁能告诉我矩阵怎么用latex表示…… 差不多就这样 //minamoto #include<iostream> #include<cstdio> #include ...

  10. 矩阵乘法快速幂 codevs 1574 广义斐波那契数列

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

随机推荐

  1. vue之sync

    在 Vue 中,.sync 是一个用于实现双向数据绑定的特殊修饰符.它允许父组件通过一种简洁的方式向子组件传递一个 prop,并在子组件中修改这个 prop 的值,然后将修改后的值反馈回父组件,实现双 ...

  2. ZigZag Conversion——LeetCode进阶路⑥

    原题链接https://leetcode.com/problems/zigzag-conversion/ 没开始看题目时,小陌发现这道题似乎备受嫌弃,被n多人踩了,还有点小同情 题目描述 The st ...

  3. sqlite:No module named _sqlite3

    执行代码报错:"sqlite:No module named _sqlite3" 执行环境说明 某台服务器上执行DrissionPage相关程序报错,本机没有问题. 解决说明 本机 ...

  4. A2A Java 示例

    克隆代码 git clone https://github.com/google-a2a/a2a-samples cd a2a-samples/samples/java 本项目是 Agent-to-A ...

  5. 处理日期和时间的chrono库

    C++11中提供了日期和时间相关的库chrono,通过chrono库可以很方便地处理日期和时间,为程序的开发提供了便利.chrono库主要包含三种类型的类:时间间隔duration.时钟clocks. ...

  6. 鸿蒙Next仓颉语言开发实战教程:订单列表

    大家上午好,最近不断有友友反馈仓颉语言和ArkTs很像,所以要注意不要混淆.今天要分享的是仓颉语言开发商城应用的订单列表页. 首先来分析一下这个页面,它分为三大部分,分别是导航栏.订单类型和订单列表部 ...

  7. 在MySQL中悲观锁及乐观锁的应用

    本文由 ChatMoney团队出品 在数据库管理系统中,锁机制是保证数据一致性和并发控制的重要手段.MySQL,作为广泛使用的数据库系统之一,提供了多种锁策略来处理并发访问时可能引发的数据不一致性问题 ...

  8. LeetCode 914卡盘分组

    看了官方题解如下: class Solution { public boolean hasGroupsSizeX(int[] deck) { int N = deck.length; int[] co ...

  9. 长亭雷池WAF(safeline)社区版安装教程

    雷池WAF的技术文档,并不包含 Docker 和 Docker Compose V2 安装文档,更新记录一下,共同学习,共同进步 配置需求 操作系统:Linux 指令架构:x86_64 软件依赖:Do ...

  10. 二、SDK编译

    二.sdk编译 1.linux 1.1.一键编译 ./build.sh lunch # RK_ROOTFS_SYSTEM目前可设定三种系统:buildroot.debian. yocto export ...