矩阵快速幂与快速幂模板 整理
快速幂和矩阵快速幂, 都是优化, 使时间复杂度在 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; }
岂曰无衣?与子同袍。王于兴师,修我戈矛。与子同仇!
岂曰无衣?与子同泽。王于兴师,修我矛戟。与子偕作!
岂曰无衣?与子同裳。王于兴师,修我甲兵。与子偕行!