Power of Matrix

思路

书上的原题, 早就会了

听了一下 WGC 大佬讲题, 这篇权当记录一下, 并且熟练一下矩阵 LATEX 的写法

首先我们发现, 直接往上加是慢的, 我们考虑先转化一下

si=A0+A1+A2+Ai

那么有, si=si1+Ai

考虑用这个来矩阵优化

容易想到设计矩阵

(siAi)

那么如何转移

显然的

(siAi)(II0A)=(si+1Ai+1)

直接做就好了

不是哥们, 思路错了

实际上我们需要把矩阵扔进去, 而非直接用矩阵套矩阵来处理

实现

框架#

以这个题, 确定我矩阵的基本模板

实现#

#include <bits/stdc++.h>
#define int long long
const int MAXN = 300;
const int MOD = 10;

int N, K, i, j;
struct Matrix
{
    int M[MAXN][MAXN];
    void clear() { memset(M, 0, sizeof(M)); }
    void reset() {
        clear();
        for (int i = 1; i <= N; ++i)
            M[i][i] = 1;
    }
    Matrix friend operator * (const Matrix &A, const Matrix &B) {
        Matrix Ans;
        Ans.clear();
        for (int i = 1; i <= N; ++i)
            for (int k = 1; k <= N; ++k)
                for (int j = 1; j <= N; ++j)
                    Ans.M[i][j] = (Ans.M[i][j] + A.M[i][k] * B.M[k][j]) % MOD;
        return Ans;
    }
    Matrix friend operator + (const Matrix &A, const Matrix &B) {
        Matrix Ans;
        Ans.clear();
        for (int i = 1; i <= N; ++i)
            for (int j = 1; j <= N; ++j)
                Ans.M[i][j] = (A.M[i][j] + B.M[i][j]) % MOD;
        return Ans;
    }
} base, ans;

inline Matrix matrix_quickpow(Matrix T, int P)
{
    Matrix Ans;
    Ans.reset();
    while (P)
    {
        if (P & 1)
            Ans = Ans * T;
        T = T * T;
        P >>= 1;
    }
    return Ans;
}

signed main()
{
    while (scanf("%lld %lld", &N, &K) && N && K)
    {
        base.clear(), ans.clear();
        for (i = 1; i <= N; ++i) {
            for (j = 1; j <= N; ++j)
                scanf("%lld", &base.M[i][j]);
            base.M[N + i][i] = base.M[N + i][N + i] = 1;
        }
        N <<= 1;
        ans = matrix_quickpow(base, K + 1);
        N >>= 1;
        for (i = 1; i <= N; ++i)
            for (j = 1; j <= N; ++j) {
                int Out = ans.M[N + i][j] % MOD;
                if (i == j)
                    Out = (Out + MOD - 1) % MOD;
                printf("%lld", Out);
                if (j == N) printf("\n");
                else printf(" ");
            }
        printf("\n");
    }
    return 0;
}

总结

善于推导递推

矩阵的的特殊实现, 仅仅只需要把东西扔进去

posted @   Yorg  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示