矩阵快速幂与快速幂模板 整理

来源:互联网 发布:日本人用的软件 编辑:程序博客网 时间:2024/06/05 15:59


快速幂和矩阵快速幂, 都是优化,  使时间复杂度在 log(N) 内,  对于 超大数 运算 极为有效

矩阵快速幂与快速幂 其核心思想一样,   只不过用矩阵表达;

模板如下:


快速幂:

typedef long long LL;LL fun(LL x,LL n,){    LL res=1;    while(n>0)    {        if(n & 1)            res=(res*x)%Max;        x=(x*x)%Max;        n >>= 1;    }    return res;}

矩阵快速幂:

struct Matrix{ll arr[N][N];void init(){memset(arr,0,sizeof(arr));for(int i=0;i<MAXN;i++)a[i][i]=1;//初始化}}A;Matrix mul(Matrix X,Matrix Y)// 矩阵乘法{Matrix ans;for(int i=0;i<MAXN;i++)for(int j=0;j<MAXN;j++){ans.arr[i][j]=0;for(int k=0;k<MAXN;k++)ans.arr[i][j]+=X.arr[i][k]*Y.arr[k][j];ans.arr[i][j]%=MOD;}return ans;}Matrix Q_pow(Matrix B,int n)// ¾ØÕó¿ìËÙÃÝ {Matrix ans;ans.init();while(n){if(n&1)ans=mul(ans,B);n>>=1;B=mul(B,B);}return ans;}Matrix Add(Matrix a,Matrix b)  //(a+b)%mod 矩阵加法{      int i,j,k;      Matrix ans;      for(i=0;i<MAXN;i++)          for(j=0;j<MAXN;j++)          {              ans.arr[i][j]=a.arr[i][j]+b.arr[i][j];              ans.arr[i][j]%=MOD;          }      return ans;  }  Matrix Sum(Matrix a,int n)// 矩阵和{int m;Matrix ans,pre;if(n==1) return ans;m=n/2;pre=Sum(a,m);ans=Add(pre,mul(pre,Q_pow(a,m)));if(n&1)ans=Add(ans,Q_pow(a,n));return ans;}