矩阵快速幂
矩阵快速幂和整数快速幂没有什么差别,唯一的差别在于,先写一个矩阵相乘的函数,比如
a为一个矩阵,求a^10。先定义一个函数求两个矩阵相乘
#include<bits/stdc++.h>
#define mod 10000
#define N 2
struct node
{
int m[N+1][N+1];
node()
{
m[1][1]=1;m[1][2]=1;
m[2][1]=1;m[2][2]=0;
}
};
node mul(node a,node b)
{
node ans;
int i,j,k;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
ans.m[i][j]=0;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
for(k=1;k<=N;k++)
ans.m[i][j]=(ans.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
return ans;
}
然后和快速幂相同。采用二进制
node ans,t;
int i,j;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
if(i==j)ans.m[i][j]=1;
else ans.m[i][j]=0;
while(p)
{
if(p&1)
ans=mul(ans,t);
t=mul(t,t);
p=p>>1;
}
return ans.m[2][1];//视公式而定