模板——矩阵快速幂

/************************************************
Author        :powatr
Created Time  :2015-8-5 21:06:30
File Name     :b.cpp
************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int MAX = 50;
int n;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;

struct Matrix
{
    int a[MAX][MAX];
    void inti()
    {
        memset(a, 0, sizeof(a));
        for(int i = 0 ; i < n; i++)
            a[i][i] = 1;
    }
}matrix;

Matrix mul(Matrix a, Matrix b)//矩阵乘法
{
    Matrix ans;
    for(int i = 0 ; i < n; i++)
        for(int j = 0 ; j <n ;j++){
            ans.a[i][j] = 0;
            for(int k = 0; k < n; k++)
                ans.a[i][j] += a.a[i][j] * b.a[k][j];
            ans.a[i][j] %= mod;
        }
    return ans;
}

Matrix add(Matrix a, Matrix b) //矩阵加法
{
    int i, j, k;
    Matrix ans;
    for(int i = 0 ; i < n; i++)
        for(int j = 0 ; j < n; j++){
            ans.a[i][j] = a.a[i][j] + b.a[i][j];
            ans.a[i][j] %= mod;
        }
    return ans;
}

Matrix pow(Matrix a, int n) // 矩阵快速幂
{
    Matrix ans;
    ans.inti();
    while(n){
        if(n&1) ans = mul(ans, a);
        n>>= 1;
        a = mul(a, a);
    }
    return ans;
}

Matrix sum(Matrix a, int n)//矩阵幂和
{
    int m;
    Matrix ans, pre;
    if(n == 1) return a;
    m = n >> 1;
    pre = sum(a, m);
    ans = add(pre, mul(pre, pow(a, m)));
    if(n&1) ans = add(ans, pow(a, n));
    return ans;
}
void output(Matrix a) //输出
{
    for(int i = 0 ; i < n; i++)
        for(int j = 0 ; j < n ; j++)
            printf("%d%c",a.a[i][j], j == n -1 ? ‘\n‘ : ‘ ‘);
}

int main()
{
    Matrix ans;
    scanf("%d", &n);
    for(int i = 0 ; i < n; i++)
        for(int j = 0; j < n; j++){
            scanf("%d%d", &matrix.a[i][j]);
            matrix.a[i][j] %= mod;
        }
   return 0;
}

  

时间: 2024-10-10 12:57:08

模板——矩阵快速幂的相关文章

[模板] 矩阵快速幂

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

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

模板 快速幂模板 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

矩阵快速幂 模板

矩阵快速幂模板 1 #include<stdio.h> 2 #include<math.h> 3 #include<set> 4 #include<string.h> 5 using namespace std; 6 int const mod=1e9+7; 7 struct matrix 8 { 9 long long m[3][3]; 10 matrix() 11 { 12 memset(m,0,sizeof(m)); 13 } 14 matrix op

POJ_Fibonacci POJ_3070(矩阵快速幂入门题,附上自己写的矩阵模板)

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10521   Accepted: 7477 Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequenc