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

2019-08-16 07:47:57来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:kuangbin专题 专题一 简单搜索 棋盘问题 POJ - 1321

下一篇:kuangbin专题 专题一 简单搜索 Prime Path POJ - 3126