题目传送门sx
多个方阵乘起来,如果一个一个乘那就太慢了,可以用类似乘法运算的快速幂。
void ksm()
{
for(int i=1;i<=n;i++) ans.a[i][i]=1;
while(k){
if(k%2) ans=ans*g;
g=g*g;
k/=2;
}
}
这里的乘号重载了
struct st{
LL a[11][11];
}g,ans;
st operator *(st a,st b)
{
st c;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
c.a[i][j]=0;
for(int k=1;k<=n;k++)
c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j]%MOD)%MOD;
}
return c;
}
就把乘号定义为上述运算。