zoukankan      html  css  js  c++  java
  • P3390 【模板】矩阵快速幂

    题目背景

    矩阵快速幂

    题目描述

    给定n*n的矩阵A,求A^k

    输入输出格式

    输入格式:

    第一行,n,k

    第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素

    输出格式:

    输出A^k

    共n行,每行n个数,第i行第j个数表示矩阵第i行第j列的元素,每个元素模10^9+7

    没什么可分析的,就是一道板子题,嘤嘤嘤我刚看到还以为是A*K...........做了半天发现是A^K

    矩阵快速幂并没有什么困难的地方,毕竟快速幂大家都会,其实这个代码这么长,无非就是定义了一次矩阵乘法的方式,在定义完之后就可以当普通数据来直接算了

    代码如下

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #define mod 1000000007
    using namespace std;
    struct mat {
        long long m[101][101];
    } a,e;
    long long n,k;
    mat cheng(mat A,mat B) {
        mat c;
        memset(c.m,0,sizeof c.m);
        for(int i=1; i<=n; ++i)
            for(int j=1; j<=n; ++j)
                for(int k=1; k<=n; ++k)
                    c.m[i][j]=c.m[i][j]%mod+A.m[i][k]*B.m[k][j]%mod;
        return c;
    }
    mat quickpower(mat x,long long y) {
        mat anser=e;
        while(y!=0) {
            if(y&1)
                anser=cheng(anser,x);
            x=cheng(x,x);
            y/=2;
        }
        return anser;
    }
    int main() {
        scanf("%lld %lld",&n,&k);
        for(int i=1; i<=n; ++i)
            for(int j=1; j<=n; ++j)
                scanf("%lld",&a.m[i][j]);
        for(int i=1; i<=n; i++)
            e.m[i][i]=1;
        mat ans=quickpower(a,k);
        for(int i=1; i<=n; ++i) {
            for(int j=1; j<=n; ++j)
                printf("%lld ",ans.m[i][j]%mod);
            printf("
    ");
        }
        return 0;
    }

    这里的函数cheng()其实就是定义了一个矩阵相乘的方法,类似的,我们也可以用重载运算符来做矩阵的乘法运算,这些都是可以的

  • 相关阅读:
    node设置跨域白名单
    vueInitVux中引入bootstrap、jquery步骤
    npm命令集合
    css横屏问题的设置
    verdaccio启动命令
    拖拽上传文件在火狐中会打开新窗口
    vue监听input输入框限制输入长度
    axios get请求传递参数 es6语法
    export default和export的使用
    webpack中如何使用vue
  • 原文地址:https://www.cnblogs.com/this-is-M/p/10679603.html
Copyright © 2011-2022 走看看