Fork me on GitHub

矩阵详细

矩阵蛮好用的可以log的优化dp!!!

矩阵乘法

一张图

矩阵构造

以Fibonacci数列:F(0)=1 , F(1)=1 , F(n)=F(n-1)+F(n-2)为例

fi-1 fi-2
fi 1 1
fi-1 1 0

因为fi=fi-1 * 1+fi-2 * 1

fi-1=fi-1 * 1

因此矩阵为

1 1
1 0

还不懂?!戳这

矩阵快速幂

yangrunze的题解所说矩阵快速幂=矩阵乘法+快速幂

所以前置芝士:快速幂

助你理解快速幂:

有注释
#include<bits/stdc++.h>
using namespace std;//long long
int n;
long long m;
long long a[105][105];
long long ans[105][105];
long long MOD=1e9+7;
void f(){//ans=ans*a
	long long c[105][105]={0};
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int k=1;k<=n;k++){
				c[i][j]=(c[i][j]+ans[i][k]*a[k][j])%MOD;//因为是矩阵所以乘法是这样
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			ans[i][j]=c[i][j];//将答案赋值给ans
		}
	}
}
void fl(){//a=a*a
	long long c[105][105]={0};
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int k=1;k<=n;k++){
				c[i][j]=(c[i][j]+a[i][k]*a[k][j])%MOD;
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			a[i][j]=c[i][j];
		}
	}
}
long long read(){   
    long long f=1;
    long long x=0;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-') f=-1;
        c=getchar();
    }
    while('0'<=c&&c<='9'){
        x=x*10+c-'0';
        c=getchar();
    }
    return x*f;
}
int main(){
	n=read();
	m=read();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			a[i][j]=read();
		}
	}
	for(int i=1;i<=n;i++) ans[i][i]=1;//为什么这样初始化:你想想这样任何矩阵*ans都=这个矩阵;(就比如快速幂里把ans初始化为1)
	while(m>0){//这何不是快速幂框架乎?????
		if(m%2){
			f();//ans=ans*a;
		}
		fl();//a=a*a
		m>>=1;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cout<<ans[i][j]%MOD<<" ";
		}
		cout<<endl;
	}
	return 0;
}

The end...

posted @ 2024-08-30 18:34  zjr20120321  阅读(11)  评论(0)    收藏  举报