LuoguP3390|【模板】矩阵快速幂|板子

目录

  • 快速幂

    • 板子
  • 矩阵快速幂
    • Problem
    • 板子

快速幂

板子

long long qpow(long long a,long long b){
    long long ans=1,base=a;
    while(b){
        if(b&1) ans=ans*base%c;
        base=base*base%c;
        b>>=1;
    }
    return ans%c;
}

矩阵快速幂

Problem

板子

#include <cstdio>
#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
const ll mod=1000000007;
const int maxn=105;
ll n,k;
struct mat{ll m[maxn][maxn];};
mat a;
mat mul(mat a,mat b){
    mat c;
    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) c.m[i][j]=0;
    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 qpow(mat a,ll b){
    mat ans,base=a;
    //构造单位矩阵
    //单位矩阵,它从左上角到右下角的对角线上的元素均为1,除此以外全都为0。
    //它在矩阵乘中相当于数乘中的1,即任何矩阵乘它都等于本身。
    for(int i=1;i<=n;i++) ans.m[i][i]=1;
    while(b){
        if(b&1) ans=mul(ans,base);
        base=mul(base,base);
        b>>=1;
    }
    return ans;
}
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]);
    mat ans=qpow(a,k);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++) printf("%lld ",ans.m[i][j]%mod);
        printf("\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/saitoasuka/p/10228263.html

时间: 2024-10-14 06:20:12

LuoguP3390|【模板】矩阵快速幂|板子的相关文章

模板——矩阵快速幂

/************************************************ Author :powatr Created Time :2015-8-5 21:06:30 File Name :b.cpp ************************************************/ #include <cstdio> #include <algorithm> #include <iostream> #include <s

[模板] 矩阵快速幂

矩阵快速幂是一个快速幂的延伸,但实际上区别不大,主要思想是一样的. 题干: 题目背景 矩阵快速幂 题目描述 给定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^1

模板——矩阵快速幂+矩阵乘法

#include<bits/stdc++.h> using namespace std; const long long P=1e9+7; long long n,m; struct nob{ long long juzhen[105][105]; friend nob operator * (const nob &a,const nob &b){ nob c; for (int i=1; i<=n; i++){ for (int l=1; l<=n; l++){

矩阵快速幂板子

struct Matrix { __int64 v[110][110]; Matrix() { memset(v, 0, sizeof(v)); } Matrix operator *(const Matrix B) // 重载的速度比写独立的函数慢点. { int i, j, k; Matrix C; for(i = 0; i <= tot; i ++) for(j = 0; j <= tot; j ++) for(k = 0; k <= tot; k ++) { C.v[i][j]

矩阵快速幂 模板与简单讲解

模板 快速幂模板 1 void solve(matrix t,long long o) 2 { 3 matrix e; 4 5 memset(e.a,0,sizeof(e.a)); 6 7 for (int i = 0;i < d;i++) 8 e.a[i][i] = 1; 9 10 while (o) 11 { 12 if (o & 1) 13 { 14 e = mul(e,t); 15 } 16 17 o >>= 1; 18 19 t = mul(t,t); 20 } 21

矩阵乘法 洛谷 P3390【模板】矩阵快速幂

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 算法:矩阵快速幂

51nod1113(矩阵快速幂模板)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1113 题意:中文题诶- 思路:矩阵快速幂模板 代码: 1 #include <iostream> 2 #define ll long long 3 using namespace std; 4 5 const int mod = 1e9+7; 6 const int MAXN = 1e2+10; 7 int n, m; 8 9 typedef struct

poj 3070 Fibonacci (矩阵快速幂乘/模板)

题意:给你一个n,输出Fibonacci (n)%10000的结果 思路:裸矩阵快速幂乘,直接套模板 代码: #include <cstdio> #include <cstring> #include <iostream> using namespace std; typedef long long ll; const int N=2,M=2,P=2; const int MOD=10000; struct Matrix { ll m[N][N]; }; Matrix

矩阵快速幂模板篇

转载请注明出处:http://blog.csdn.net/u012860063 或许你们看不太懂,纯属自用: 第一种: Description Let's define another number sequence, given by the following function: f(0) = a f(1) = b f(n) = f(n-1) + f(n-2), n > 1 When a = 0 and b = 1, this sequence gives the Fibonacci seq