快速幂和矩阵快速幂, 都是优化, 使时间复杂度在 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;
}