51nod 1126 求递推序列的第N项 矩阵快速幂

题目:

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1126

题意:

有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
给出A,B和N,求f(n)的值。
Input
输入3个数:A,B,N。数字之间用空格分割。(-10000 <= A, B <= 10000, 1 <= N <= 10^9)
Output
输出f(n)的值。

思路

矩阵快速幂裸题,首先构造一个2*2的矩阵,矩阵元素从左至右从上至下分别是 a 1 b 0,求这个矩阵的n-2次幂,然后构造一个1*2的矩阵,元素分别是f(2) f(1),把这个矩阵与之前求得的幂相乘,得到的结果中第一行第一列的元素就是答案

#include <bits/stdc++.h>

using namespace std;

const int N = 10 + 10, MOD = 7;

struct matrix
{
    int row, col;
    int mat[N][N];
    matrix(int _row=0, int _col=0)
    {
        init(_row, _col);
    }
    void init(int _row, int _col)
    {
        row = _row, col = _col;
        memset(mat, 0, sizeof mat);
    }
    matrix operator* (matrix b)
    {
        matrix c(row, b.col);
        for(int i = 1; i <= row; i++)
            for(int j = 1; j <= b.col; j++)
                for(int k = 1; k <= col; k++)
                    c.mat[i][j] = (c.mat[i][j] + mat[i][k] * b.mat[k][j] % MOD + MOD) % MOD;
        return c;
    }
};
matrix matrix_pow(matrix a, int b)
{
    matrix ans(a.row, a.col);
    ans.mat[1][1] = ans.mat[2][2] = 1;
    while(b)
    {
        if(b & 1) ans = ans * a;
        b >>= 1;
        a = a * a;
    }
    return ans;
}
int main()
{
    int a, b, n;
    scanf("%d%d%d", &a, &b, &n);
    if(n <= 2) printf("%d\n", 1);
    else
    {
        matrix arr(2, 2);
        arr.mat[1][1] = a, arr.mat[2][1] = b;
        arr.mat[1][2] = 1, arr.mat[2][2] = 0;
        matrix brr(1, 2);
        brr.mat[1][1] = 1, brr.mat[1][2] = 1;
        arr = matrix_pow(arr, n - 2);
        brr = brr * arr;
        printf("%d\n", brr.mat[1][1]);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值