深圳幻海软件技术有限公司 欢迎您!

矩阵快速幂

2023-03-28

一、基础知识1.矩阵乘法设A为的矩阵,B为的矩阵,那么称 的矩阵C为矩阵A与B的乘积,记作 ,其中矩阵C中的第 行第 列元素可以表示为:1typedeflonglongll;2constintMod=10000;3structmat{4lla[2][2];5}

一、基础知识

1.矩阵乘法

设A为的矩阵,B为的矩阵,那么称 的矩阵C为矩阵A与B的乘积,记作 ,其中矩阵C中的第 行第 列元素可以表示为:

 1 typedef long long ll;
 2 const int Mod=10000;
 3 struct mat{
 4     ll a[2][2];
 5 };
 6 mat mat_mul(mat x,mat y){
 7     mat ans;
 8     memset(ans.a,0,sizeof(ans.a));
 9     for (int i=0;i<2;i++){
10         for (int j=0;j<2;j++)
11         for (int k=0;k<2;k++)
12             ans.a[i][j]=ans.a[i][j]+(x.a[i][k]*y.a[k][j])%Mod;
13     }
14     return ans;
15 }
2.矩阵快速幂
顾名思义,就是将数字的幂运算变成矩阵的幂运算。orz...直接上代码就好。
 1 mat mat_mul(mat &x,mat &y,int Mod){
 2     mat ans;
 3     memset(ans.a,0,sizeof(ans.a));
 4     for (int i=0;i<2*n;i++)
 5         for (int j=0;j<2*n;j++)
 6         for (int kk=0;kk<2*n;kk++){
 7             ans.a[i][j]+=x.a[i][kk]*y.a[kk][j];
 8             ans.a[i][j]%=Mod;
 9         }
10     return ans;
11 }
12 void mat_pow(mat &res,int k,int Mod){
13     mat c=res;
14     k--;
15     while (k){
16         if (k&1) res=mat_mul(res,c,m);
17         k>>=1;
18         c=mat_mul(c,c,m);
19     }
20 }
二、应用(例题)
1. poj3070(斐波那契数列)
2. hdoj1575 (求矩阵的秩)
3. poj3233
4. hdoj2604
5. hdoj1757
6. zoj3497(应用题)
7. zoj2893(应用题)

转载于:https://www.cnblogs.com/changer-qyz/p/8442735.html