矩阵蛮好用的可以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...
标签:int,矩阵,long,ans,fi,105 From: https://www.cnblogs.com/zjr20120321/p/18389299