//O(nlogn)
long long quickmul(int a,int b)
{
long long ret=1;
for(; b ; b >>=1 ,a =(long long) a * a % mod)
if((b & 1))
ret=ret * a % mod;
return ret;
}
矩阵快速幂
#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct Mat{
ll m[101][101];
};
int mod;
int n;
Mat a,e;//a为输入矩阵, e为输出矩阵
Mat mul(Mat x,Mat y){
Mat c;
for(int i=1;i<=n;i++){
for(int j=1;j<=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.m[i][k]*y.m[k][j])%mod;
}
c.m[i][j]%=mod;//视运行次数可去掉内层取模节省时间
}
}
return c;
}
Mat pow(Mat x,ll y){//求矩阵x的y次幂
Mat ans;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j)ans.m[i][i] = 1;
else ans.m[i][j] = 0;//防止多次输入,清零
while(y){
if(y&1)ans = mul(ans,x);
x = mul(x,x);
y>>=1;
}
return ans;//返回ans
}