快速幂模板:
typedef long long ll;
ll const mod=1000000007;
ll exp_mod(ll x,ll y)//求x^y对mod取模
{
ll ans=1;
while(y)
{
if(y&1)
ans=(ans*x)%mod;
x=(x*x)%mod;
b>>=1;
}
return ans;
}
其中要好好理解用y来寻找循环次数,其次就是为什么其中出现了在if(y&1)的条件之下必须进行ans*=x;
说完了简单的快速幂的基本模式以后,再来看看在矩阵中的快速幂运算:
首先定义矩阵结构体:
struct Mat(int x,int y)
{
int m[101][101];
}
结构体能比较方便地储存以及可以很好地作为函数的参数进行传递;
其次矩阵当中的乘法法则和数字中的乘法法则不太一样:
从而定义矩阵的乘法代码为:
Mat Mut(Mat x,Mat y)
{
Mat c;
for(int i=1;i<=n;i++)
for(int j=1;i<=n;j++)
c.m[i][j]=0;//初始化乘法之后的数组
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
{
c.m[i][j]=c.m[i][j]+x.[i][k]*y.[k][j];
}
return c;
}
从而在按照原来的快速幂的模板码出矩阵快速幂模板
但是必须先定义一个幺元,就比如在数字计算中的幺元就是1。
Mat e;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
e.m[i][j]=1;
矩阵快速幂模板:
Mat pow(Mat x,ll y)
{
Mat ans=e;
while(y)
{
if(y&1)
ans=Mut(ans,x);
x=Mul(x,x);
y>>1;
}
return ans;
}