矩阵快速幂乘

学长今天讲了矩阵快速幂乘,给大家分享一下,还没写完会一直更新的。
先讲一下 快速幂 m^n%k

int quickpow(int m,int n,int k)
   {
       int b=1;
       while(n>0)
       {
           if(n&1)
               b=(b*m)%k;
           n=n>>1;
           m=m*m%k;
       }
       return b;
   }

再引出矩阵快速幂乘 矩阵P的n次幂对mod的取模

struct Matrix;
{
    int m[maxn][maxn];//maxn是方阵的大小
}p,I;
Matrix    matrixmul( Matrix  a, Matrix   b)
 {
     int i,j,k;
      Matrix   c;
    for(i=0;i<maxn;i++)
    for(j=0;j<maxn;j++)
    {
        c.m[i][j]=0;
        for(k=0;k<maxn;k++)
          c.m[i][j]+=a.m[i][k]*b.m[k][j]%mod;///mod 是要取模的值
        c.m[i][j]%=mod;
    }
    return c;
 }
 Matrix  quickpow(long long n)
 {
      Matrix m=p,b=I;///I 是单位矩阵
      while(n>0)
      {
          if(n&1)
             b=matrixmul(b,m);
          n=n>>1;
          m=matrixmul(m,m);
      }
      return b;
 }

猜你喜欢

转载自blog.csdn.net/xiaoshazheng/article/details/81320496