其他分享
首页 > 其他分享> > 矩阵快速幂(运算符重载)

矩阵快速幂(运算符重载)

作者:互联网

https://www.luogu.com.cn/problem/P3390

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cctype>
#define ll long long
#define gc() getchar()
#define maxn 105
#define mo 1000000007
using namespace std;

inline ll read()
{
    ll a = 0;
    int f = 0;
    char p = gc();
    while (!isdigit(p))
    {
        f |= p == '-';
        p = gc();
    }
    while (isdigit(p))
    {
        a = (a << 3) + (a << 1) + (p ^ 48);
        p = gc();
    }
    return f ? -a : a;
}
int n;

struct ahaha
{
    ll a[maxn][maxn]; 
    ahaha()
    {
        memset(a, 0, sizeof a);
    }
    inline void build()
    { //建造单位矩阵
        for (int i = 1; i <= n; ++i)
            a[i][i] = 1;
    }
} a;
ahaha operator*(const ahaha &x, const ahaha &y)
{
    ahaha z;
    for (int k = 1; k <= n; ++k)
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= n; ++j)
                z.a[i][j] = (z.a[i][j] + x.a[i][k] * y.a[k][j] % mo) % mo;
    return z;
}

ll k;
inline void init()
{
    n = read();
    k = read();
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            a.a[i][j] = read();
}

int main()
{
    init();
    ahaha ans;
    ans.build();
    do
    {
        if (k & 1)
            ans = ans * a;
        a = a * a;
        k >>= 1;
    } while (k);
    for (int i = 1; i <= n; putchar('\n'), ++i)
        for (int j = 1; j <= n; ++j)
            printf("%d ", ans.a[i][j]);
    return 0;
}

 

标签:int,ll,矩阵,运算符,while,gc,重载,include,define
来源: https://www.cnblogs.com/Wang-Xianyi/p/16536313.html