矩阵快速幂模板(mark)

来源:互联网 发布:知乎 刘备 王者 编辑:程序博客网 时间:2024/05/31 19:41
#include<iostream>  #include<cstdio>  #include<cstring>  #include<cmath>  #include<algorithm>  #include<vector>  #include<queue>  #include<map>  #define LL long long  #define MAXN 1000010  using namespace std;  const int INF=0x3f3f3f3f;  //----以下为矩阵快速幂模板-----//   const int mod=9973;  const int NUM=11;//定义矩阵能表示的最大维数   int N;//N表示矩阵的维数,以下的矩阵加法、乘法、快速幂都是按N维矩阵运算的   struct Mat{//矩阵的类      int a[NUM][NUM];      void init()//将其初始化为单位矩阵        {          memset(a,0,sizeof(a));          for(int i=0;i<NUM;i++)          {              a[i][i]=1;          }      }  };  Mat add(Mat a,Mat b)//(a+b)%mod  矩阵加法    {      Mat 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;  }  Mat mul(Mat a,Mat b) //(a*b)%mod  矩阵乘法    {      Mat 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][k]*b.a[k][j];              }              ans.a[i][j]%=mod;          }      }      return ans;  }  Mat power(Mat a,int num)//(a^n)%mod  矩阵快速幂   {      Mat ans;      ans.init();      while(num)      {          if(num&1)          {              ans=mul(ans,a);          }          num>>=1;          a=mul(a,a);      }      return ans;  }  Mat pow_sum(Mat a,int num)//(a+a^2+a^3....+a^n)%mod 矩阵的幂和  {      int m;      Mat ans,pre;      if(num==1)          return a;      m=num/2;      pre=pow_sum(a,m);      ans=add(pre,mul(pre,power(a,m)));      if(num&1)          ans=add(ans,power(a,num));      return ans;  }  void output(Mat 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()  {      int t,n,k,ans,i,j;      scanf("%d",&t);      while(t--)      {          scanf("%d%d",&n,&k);          N=n;          ans=0;          Mat a,temp;          for(i=0;i<N;i++)          {              for(j=0;j<N;j++)              {                  scanf("%d",&a.a[i][j]);              }          }          temp=power(a,k);          for(i=0;i<N;i++)          {              ans=(ans+temp.a[i][i])%mod;          }          printf("%d\n",ans);      }      return 0;  }  

原创粉丝点击