ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-07-31 02:02:55  阅读:144  来源: 互联网

标签:int ll 矩阵 运算符 while gc 重载 include define


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

  • 把*重载成矩阵的乘法
  • 再用普通的快速幂就行
  • (AC代码是copy的,实在debug不出了)
#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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有