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

时间: 2024-10-11 01:18:29

P1349 广义斐波那契数列(矩阵乘法)的相关文章

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

P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请你求出 f(n) mod 1000000007 的值. 输入输出格式 输入格式: ·第 1 行:一个整数 n 输出格式: 第 1 行: f(n) mod 1000000007 的值 输入输出样例 输入样例#1: 5 输出样例#1: 5 输入样例#2: 10 输出样例#2: 55 说明

P1349 广义斐波那契数列

题目描述 广义的斐波那契数列是指形如an=p×an−1+q×an−2an=p\times a_{n-1}+q\times a_{n-2}an=p×an−1?+q×an−2?的数列.今给定数列的两系数ppp和qqq,以及数列的最前两项a1a_1a1?和a2a_2a2?,另给出两个整数nnn和mmm,试求数列的第nnn项ana_nan?除以mmm的余数. 输入格式 输入包含一行6个整数.依次是p,q,a1?,a2?,n,m,其中在p,q,a1?,a2?整数范围内,n和m在长整数范围内. 输出格式 输

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

codevs 1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an除以m的余数. 输入描述 Input Description 输入包含一行6个整数.依次是p,q,a1,a2,n,m,其中在p,q,a1,a2整数范围内,n和m在长整数范围

洛谷1349 广义斐波那契数列 【矩阵乘法】

洛谷1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an除以m的余数. 输入输出格式 输入格式: 输入包含一行6个整数.依次是p,q,a1,a2,n,m,其中在p,q,a1,a2整数范围内,n和m在长整数范围内. 输出格式: 输出包含一行一个整数,即an除以m的余数. 输入输出样例 输入样例#1: 1 1 1 1 10 7 输出样例#1: 6 说明

HDU 5451 广义斐波那契数列

这道题目可以先转化: 令f(1) = 5+2√6 f(2) = f(1)*(5+2√6) ... f(n) = f(n-1)*(5+2√6) f(n) = f(n-1)*(10-(5-2√6)) = 10*f(n-1)-(5-2√6)f(n-1) = 10*f(n-1) - 10/(5+2√6) f(n-1) = 10*f(n-1) - 10/(5+2√6) * (5+2√6)f(n-2) = 10*f(n-1) - f(n-2) 那么就可以写成矩阵相乘的形式了 (f(n) , f(n-1))

HDU 4549 M斐波那契数列 ( 矩阵快速幂 + 费马小定理 )

HDU 4549 M斐波那契数列 (  矩阵快速幂 + 费马小定理  ) 题意:中文题,不解释 分析:最好的分析就是先推一推前几项,看看有什么规律 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef __int64 LL; #define CLR( a, b ) memset( a, b, sizeof(a) ) #define MOD 100000

HDU 4549 M斐波那契数列(矩阵快速幂&amp;费马小定理)

ps:今天和战友聊到矩阵快速幂,想到前几天学长推荐去刷矩阵专题,挑了其中唯一一道中文题,没想到越过山却被河挡住去路... 题目链接:[kuangbin带你飞]专题十九 矩阵 R - M斐波那契数列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u 题意 Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2]

斐波那契数列——矩阵的幂求解

题目: 斐波那契数列的递推公式如下: F(0) = 0; F(1) = 1; F(n + 2) = F(n + 1) + F(n); 求数列的第N项的值对10000取余的结果.( 0<=n<= 10^16) 求解斐波那契数列,如果N比较小的情况下,可以直接打表求解,但是对于N很大的情况下,并不适用. 所以,有些人会想到高精度计算,但是,N达到10^5以上时,时间复杂度难以想象,每计算一个数,需要进行高精度加法.然而还有求解对10000的取余的值. 我们可以用矩阵的幂来求解.斐波那契数列的递推公

[codevs]1250斐波那契数列&lt;矩阵dp&gt;

题目描述 Description 定义:f0=f1=1, fn=fn-1+fn-2(n>=2).{fi}称为Fibonacci数列. 输入n,求fn mod q.其中1<=q<=30000. 输入描述 Input Description 第一行一个数T(1<=T<=10000). 以下T行,每行两个数,n,q(n<=109, 1<=q<=30000) 输出描述 Output Description 文件包含T行,每行对应一个答案. 样例输入 Sample I