自用板子
struct mat{
ll m[105][105];
};
mat operator * (const mat& a,const mat& b)
{
mat c;
memset(c.m,0,sizeof(c.m));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
{
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
}
}
}
return c;
}
mat mpow(mat a,ll k)
{
mat ans;
memset(ans.m,0,sizeof(ans.m));
for(int i=0;i<n;i++) ans.m[i][i]=1;
while(k)
{
if(k&1) ans=ans*a;
a=a*a;
k>>=1;
}
return ans;
}