矩阵快速幂

Posted Lovaer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矩阵快速幂相关的知识,希望对你有一定的参考价值。

 1 #include<bits/stdc++.h>
 2 #define ll long long 
 3 #define scan(i) scanf("%d",&i)
 4 #define scand(i) scanf("%lf",&i)
 5 #define scanl(i) scanf("%lld",&i)
 6 #define f(i,a,b) for(int i=a;i<=b;i++) 
 7 #define pb(i) push_back(i)
 8 #define ppb pop_back()
 9 #define pf printf
10 #define debug(i,j) i==j?cout<<"correct!\n":cout<<"wrong~\n"<<i<<"!="<<j<<endl;return 0
11 using namespace std;
12 int t;
13 ll n; 
14 ll mi[5][5]={
15     2,4,1,0,0,
16     1,0,0,0,0,
17     0,0,1,2,1,
18     0,0,0,1,1,
19     0,0,0,0,1
20 };
21 const ll mod=998244353;
22 const int N=5;  
23 ll tmp[N][N]; 
24 ll qpow(ll x,ll i)//ans=x^i
25 {
26     ll ans = 1;
27     while(i)
28     {
29         if(i&1) ans = (ans*x)%mod;
30         i >>= 1;
31         x = (x*x)%mod;
32     }
33     return ans;
34 }
35 void multi(ll a[][N],ll b[][N],ll n)//a=axb 
36 {  
37     memset(tmp,0,sizeof tmp);  
38     for(ll i=0;i<n;i++){
39         for(ll j=0;j<n;j++){
40             for(ll k=0;k<n;k++)  
41                 tmp[i][j]+=a[i][k]*b[k][j];
42                tmp[i][j]%=mod;
43         }
44     }
45     for(ll i=0;i<n;i++){
46         for(ll j=0;j<n;j++){
47             a[i][j]=tmp[i][j];
48         }
49     }
50 }  
51 ll res[N][N];  
52 void print(){
53     for(int i=0;i<N;i++){
54         for(int j=0;j<N;j++){
55             cout<<res[i][j]<<" ";
56         }
57         cout<<endl;
58     }
59 } 
60 void Pow(ll n)//res=a^n
61 {  
62 
63     ll a[5][5]={
64     2,4,1,0,0,
65     1,0,0,0,0,
66     0,0,1,2,1,
67     0,0,0,1,1,
68     0,0,0,0,1
69     };
70     memset(res,0,sizeof(res));//n是幂,N是矩阵大小  
71     for(int i=0;i<N;i++) res[i][i]=1;  
72     while(n){  
73         if(n&1) multi(res,a,N);//res=res*a;复制直接在multi里面实现了;  
74         multi(a,a,N);//a=a*a
75         n>>=1;  
76     }  
77 }  

N是矩阵大小,a是做幂运算的矩阵,n是幂次,mod是取的模

以上是关于矩阵快速幂的主要内容,如果未能解决你的问题,请参考以下文章

矩阵快速幂

初步 - 矩阵快速幂

poj 3233(矩阵快速幂)

模板之矩阵快速幂(luogu P3390模板矩阵快速幂)

数学问题——矩阵和矩阵快速幂

矩阵快速幂