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<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #define N 105
    #define mod 1000000007
    using namespace std;
    
    long long n,k;
    struct Matrix
    {
        long long matrix[N][N];
    }a;
    
    Matrix Matrix_Mul(Matrix a,Matrix b)
    {
        Matrix c;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            {
                c.matrix[i][j]=0;
                for(int k=0;k<n;k++)
                    c.matrix[i][j]=(c.matrix[i][j]+a.matrix[i][k]*b.matrix[k][j])%mod;
            }
        return c;
    }
    
    void Matrix_Pow(long long k)
    {
        Matrix b=a;
        while(k>0)
        {
            if(k&1) a=Matrix_Mul(a,b);
            b=Matrix_Mul(b,b);
            k>>=1;
        }
    }
    
    int main()
    {
        scanf("%lld%lld",&n,&k);
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                scanf("%lld",&a.matrix[i][j]);
        Matrix_Pow(k-1);
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            printf("%lld ",a.matrix[i][j]);
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    [COCI2013]DLAKAVAC
    [TJOI2013]最长上升子序列
    AGC040E Prefix Suffix Addition
    AGC010E Rearranging
    AGC021F Trinity
    AGC002F Leftmost Ball
    JOISC2019D ふたつのアンテナ
    LOJ6210 「美团 CodeM 决赛」tree
    Luogu P3781 [SDOI2017]切树游戏
    Problem. M
  • 原文地址:https://www.cnblogs.com/lovewhy/p/8742666.html
Copyright © 2011-2022 走看看