矩阵快速幂就是将快速幂和矩阵乘法结合起来,快速幂我之前的博客里,矩阵乘法就是将矩阵快速幂和快速幂结合,
代码
#include<bits/stdc++.h>
using namespace std;
struct node {
int mat[15][15];//定义矩阵
}x,y;
node mul(node x,node y){//矩阵乘法
node tmp;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
tmp.mat [i][j]=0;
for(int k=0;k<10;k++){
tmp.mat [i][j]+=(x.mat [i][k]*y.mat [k][j])%10000007;
}
tmp.mat [i][j]=tmp.mat[i][j]%10000007;
}
}
return tmp;
}
node matpow(node x,node y,int num){//矩阵快速幂
while(num){
if(num&1){
y=mul(y,x);
}
x=mul(x,x);
num=num>>1;
}
return y;
}
int main()
{
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
cin>>x.mat[i][j];
}
}
for(int i=0;i<10;i++)
{
y.mat[i][i]=1; //构造单位矩阵相当与1。即对角线为1的矩阵
}
int num;
scanf("%d",&num);
struct node cnt=matpow(x,y,num);
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
printf("%d ",cnt.mat[i][j]);
}
cout<<endl;
}
}
矩阵快速幂与斐波那契额数列的结合
由上图 可得,我们只要解出左边的矩阵的n次方就可以了,这样我们就可以用到矩阵快速幂了,这样可以大大加快我们代码的速率,最后这个矩阵的[0][1],就是我们要的答案。
#include<bits/stdc++.h>
using namespace std;
struct node {
int mat[2][2];
}x,y;
node mul(node x,node y){//矩阵乘法
node tmp;
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
tmp.mat [i][j]=0;
for(int k=0;k<2;k++){
tmp.mat [i][j]+=(x.mat [i][k]*y.mat [k][j])%10000;
}
tmp.mat [i][j]=tmp.mat[i][j]%10000;
}
}
return tmp;
}
node matpow(node x,node y,int num){//矩阵快速幂
while(num){
if(num&1){
y=mul(y,x);
}
x=mul(x,x);
num=num>>1;
}
return y;
}
int main()
{
int num;
while(scanf("%d",&num))
{
if(num==-1)
{
return 0;
}
x.mat[0][0]=1;
x.mat[0][1]=1;
x.mat[1][0]=1;
x.mat[1][1]=0;
for(int i=0;i<2;i++)
{
y.mat[i][i]=1;
}
struct node cnt=matpow(x,y,num);
cout<<cnt.mat[0][1]%10000<<endl;
}
}