遇到类似斐波那契数列且为大数取模的问题,可以用矩阵的快速幂来做,举个例子:
这样的一道题就可以用矩阵快速幂来进行运算,我们不难知道,于是可以列写矩阵方程。
首先,用个结构体来存矩阵
struct node
{
ll a[5][5];
};
然后,用个子函数处理矩阵乘积取模的情况。
node node_mul(node e1, node e2, ll mod) //矩阵乘法运算、左乘;外加取模
{
node ff; //return的东西
memset(ff.a, 0, sizeof(ff.a));
for(int i=1; i<=3; i++)
{
for(int j=1; j<=3; j++)
{
for(int k=1; k<=3; k++)
{
ff.a[i][j]+=e1.a[i][k]*e2.a[k][j];
ff.a[i][j]%=mod;
}
}
}
return ff;
}
最后就是矩阵的快速幂
node fast_mi(node e1, ll k, ll mod)
{
node ff;
memset(ff.a, 0, sizeof(ff.a));
for(int i=1; i<=3; i++) ff.a[i][i]=1;
while(k)
{
if(k&1)
{
ff=node_mul(ff, e1, mod);
}
e1=node_mul(e1, e1, mod);
k>>=1;
}
return ff;
}
类比一下快速幂:
ll mi(ll x, ll y, ll mod) //快速幂
{
ll res=1;
x%=mod;
while(y)
{
if(y&1)
{
res=res*x%mod;
}
x=x*x%mod;
y>>=1;
}
return res;
}