#include<cstdio>
#include<cstring>
using namespace std;
#define NUM 50
int MAXN ,n,mod;
struct Matrix{
int a[NUM][NUM];
void init(){
memset(a,0,sizeof(a));
for(int i=0;i<MAXN;i++)
a[i][i]=1;
}
};
Matrix mul(Matrix a,Matrix b){
Matrix ans;
for(int i=0;i<MAXN;i++){
for(int j=0;j<MAXN;j++){
ans.a[i][j]=0;
for(int k=0;k<MAXN;k++){
ans.a[i][j]+=a.a[i][k]*b.a[k][j];
}
ans.a[i][j]%=mod;
}
}
return ans;
}
Matrix pow(Matrix a,int n){ //(a^n)%mod
Matrix ans;
ans=init();
while(n){
if(n&1)
ans=mul(ans,a);
n/=2;
a=mul(a,a);
}
return ans;
}
Matrix add(Matrix a,Matrix b){
Matrix ans;
for(int i=0;i<MAXN;i++){
for(int j=0;j<MAXN;j++){
ans.a[i][j]=(a.a[i][j]+b.a[i][j])%mod;
}
}
return ans;
}
Matrix sum(Matrix a,int n){ //(a+a^2+a^3....+a^n)%mod
int m;
Matrix ans,pre;
if(n==1)
return a;
m=n/2;
pre=sum(a,m);
ans=add(pre,mul(pre,pow(a,m)));
if(n&1)
ans=add(ans,pow(a,n));
return ans;
}
代码参考处:点击打开链接