求助,矩阵乘法前几个点T了。
查看原帖
求助,矩阵乘法前几个点T了。
168223
ShuKuang楼主2021/7/22 17:32

程序如下
其实就是斐波那契的矩阵乘法啊。

#include <bits/stdc++.h>

using namespace std;
#define int long long
const int P = 1e9 + 7;
struct Matrix {
    int h, w;
    int a[10][10];
    Matrix(int n, int m) {
        h = n, w = m;
        for (int i = 1; i <= h; ++ i) {
            for (int j = 1; j <= w; ++ j) {
                a[i][j] = 0;
            }
        }
    }
    Matrix operator * (Matrix b) {
        Matrix c(h, w);
        for (int i = 1; i <= h; ++ i) {
            for (int j = 1; j <= w; ++ j) {
                for (int k = 1; k <= w; ++ k) {
                    c.a[i][j] += a[i][k] * b.a[k][j];
                }
            }
        }
        return c;
    }

    Matrix operator % (int mod) {
        Matrix c(h, w);
        for (int i = 1; i <= h; ++ i) {
            for (int j = 1; j <= w; ++ j) {
                c.a[i][j] = a[i][j] % mod;
            }
        }
        return c;
    }
};

Matrix f(1, 2);
Matrix s(2, 2);
int n, mod, T;

Matrix qpow(Matrix a, int b) {
    Matrix c(2, 2);
    for (int i = 1; i <= 2; ++ i) c.a[i][i] = 1;
    while (b) {
        if (b & 1)
            c = c * a % P;
        a = a * a % P;
        b >>= 1;
    }
    return c % P;
}

signed main() {
#ifndef ONLINE_JUDGE
    freopen("4910.in", "r", stdin);
    freopen("4910.out", "w", stdout);
#endif
    scanf("%lld", &T);
    while (T --) {
        scanf("%lld", &n);
        f.a[1][1] = f.a[1][2] = 1;
        s.a[1][1] = 1, s.a[1][2] = 1;
        s.a[2][1] = 1, s.a[2][2] = 0;
        cout << ((f * qpow(s, n - 1) % P).a[1][1] + (f * qpow(s, n - 2) % P).a[1][2]) % P << endl;
    }    
    return 0;
}
2021/7/22 17:32
加载中...