矩阵快速幂模板

来源:互联网 发布:高铁隧道网络覆盖 编辑:程序博客网 时间:2024/06/03 10:59

矩阵快速幂的模板:

#define Matr 10 //矩阵大小,注意能小就小    struct mat//矩阵结构体,a表示内容,size大小 矩阵从1开始  {      ll a[Matr][Matr],size;      mat()      {          size=0;          memset(a,0,sizeof(a));      }  };  void print(mat m)//输出矩阵信息,debug用   {      int i,j;      printf("%d\n",m.size);      for(i=0;i<m.size;i++)      {          for(j=0;j<m.size;j++)printf("%d ",m.a[i][j]);          printf("\n");      }  }    mat multi(mat m1,mat m2,int mod)//两个相等矩阵的乘法,对于稀疏矩阵,有0处不用运算的优化   {      mat ans=mat();    ans.size=m1.size;      for(int i=1;i<=m1.size;i++)          for(int j=1;j<=m2.size;j++)              if(m1.a[i][j])//稀疏矩阵优化                   for(int k=1;k<=m1.size;k++)                      ans.a[i][k]=(ans.a[i][k]+m1.a[i][j]*m2.a[j][k])%mod;        return ans;  }  mat quickmulti(mat m,int n,int mod)//二分快速幂   {      mat ans=mat();      int i;      for(i=1;i<=m.size;i++)ans.a[i][i]=1;      ans.size=m.size;      while(n)      {          if(n&1)ans=multi(m,ans,mod);          m=multi(m,m,mod);          n>>=1;      }      return ans;  }  /* ans^=n -> mat ans=mat(); ans.size=Size; 初始化ans矩阵 ans=quickmulti(ans,n,mod); */    




0 0