学长今天讲了矩阵快速幂乘,给大家分享一下,还没写完会一直更新的。
先讲一下 快速幂 m^n%k
int quickpow(int m,int n,int k)
{
int b=1;
while(n>0)
{
if(n&1)
b=(b*m)%k;
n=n>>1;
m=m*m%k;
}
return b;
}
再引出矩阵快速幂乘 矩阵P的n次幂对mod的取模
struct Matrix;
{
int m[maxn][maxn];//maxn是方阵的大小
}p,I;
Matrix matrixmul( Matrix a, Matrix b)
{
int i,j,k;
Matrix c;
for(i=0;i<maxn;i++)
for(j=0;j<maxn;j++)
{
c.m[i][j]=0;
for(k=0;k<maxn;k++)
c.m[i][j]+=a.m[i][k]*b.m[k][j]%mod;///mod 是要取模的值
c.m[i][j]%=mod;
}
return c;
}
Matrix quickpow(long long n)
{
Matrix m=p,b=I;///I 是单位矩阵
while(n>0)
{
if(n&1)
b=matrixmul(b,m);
n=n>>1;
m=matrixmul(m,m);
}
return b;
}