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

    输入输出样例

    输入样例#1:
    2 1
    1 1
    1 1
    输出样例#1:
    1 1
    1 1

    说明

    n<=100, k<=10^12, |矩阵元素|<=1000 算法:矩阵快速幂

    分析

    矩阵快速幂的模板题,矩阵快速幂和快速幂其实思想是一样的。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int mod=1e9+7;
    const int maxn=100+5;
    inline ll read(){
        register ll x=0,f=1; char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    ll n,k;
    ll tmp[maxn][maxn];
    struct mat
    {
        ll m[maxn][maxn];
    }a,b;
    mat matmul(mat a,mat b){
        mat t;
        for(register int i=1;i<=n;++i)
        for(register int j=1;j<=n;++j){
            t.m[i][j]=0;
            for(register int k=1;k<=n;++k)
            t.m[i][j]=(t.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
        }
        return t;
    }
    void matpow(ll p){
        while(p){
            if(p&1) a=matmul(a,b);
            b=matmul(b,b);
            p=p>>1;
        }
    }
    int main()
    {
        n=read();k=read();
        for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
            a.m[i][j]=read(),b.m[i][j]=a.m[i][j];
        matpow(k-1);
        for(register int i=1;i<=n;++i){
            for(register int j=1;j<=n;++j)
                printf("%lld ",a.m[i][j]);
            printf("
    ");
        }
        return 0;
    }
    欢迎转载,转载请注明出处!
  • 相关阅读:
    详解 字符转换流
    详解 编码和解码
    详解 字符流
    详解 序列输入流
    详解 数据输入输出流
    八皇后
    这次我们从底层把线程说清楚
    四数之和递归
    PCB 内网实现《OCR文字识别》实现逻辑
    PCB 线路板人生
  • 原文地址:https://www.cnblogs.com/huihao/p/7684254.html
Copyright © 2011-2022 走看看