1 条题解

  • 1
    @ 2022-08-14 11:52:59
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    #include <queue>
    using namespace std;
    long long int n, m;
    struct node {
        long long int g[5][5];
    } f, res;
    void init(node &x) { //构造单位矩阵
        for (int i = 1; i <= 3; i++)
            for (int j = 1; j <= 3; j++)
                if (i == j)
                    x.g[i][j] = 1;
                else
                    x.g[i][j] = 0;
    }
    void multiple(node &x, node &y, node &z) { //矩阵乘法运算
        memset(z.g, 0, sizeof(z.g));
    
        for (int i = 1; i <= 3; i++)
            for (int j = 1; j <= 3; j++)
                if (x.g[i][j]) {
                    for (int k = 1; k <= 3; k++) {
                        z.g[i][k] += x.g[i][j] * y.g[j][k];
    
                        if (z.g[i][k] >= m)
                            z.g[i][k] %= m;
                    }
                }
    }
    void quickpow(int k) { //快速幂
        init(res);
        node temp = f, t;
    
        while (k) {
            if (k & 1) {
                multiple(res, temp, t);
                res = t;
            }
    
            multiple(temp, temp, t);
            temp = t;
            k >>= 1;
        }
    }
    long long int solve() {
        if (n <= 1)
            return 1;
    
        quickpow(n - 1);
        long long int ret = res.g[1][1] * 1 + res.g[1][2] * 1 + res.g[1][3] * 1;
    
        if (ret >= m)
            ret %= m;
    
        return ret;
    }
    int main() {
        scanf("%d%d", &n, &m);
        f.g[1][1] = 1;
        f.g[1][2] = 1;
        f.g[1][3] = 0;
        f.g[2][1] = 0;
        f.g[2][2] = 1;
        f.g[2][3] = 1;
        f.g[3][1] = 0;
        f.g[3][2] = 1;
        f.g[3][3] = 0;
        long long int ans = solve();
        printf("%d\n", ans);
        return 0;
    }
    
  • 1

信息

ID
1515
难度
10
分类
线性代数 | 矩阵乘法 点击显示
标签
递交数
1
已通过
1
通过率
100%
上传者