最初は、線形代数行列乗算、行およびマトリックスのような第2の行列の列数の行列乗算状態から知っている学習し、第1の行列乗算は、第1の行列の第2行によって乗算されます結果として、行列の最初の列の最初の行と列の要素の対応する要素。(詳細な線形代数を参照)
ので、我々は、コード行列乗算矯正を書くことができます
struct JZ{ int m[maxn][maxn]; };
JZ muti(JZ a,JZ b)
{
JZ temp;
memset(temp.m,0,sizeof(temp.m));
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++){
for(int k=0;k<maxn;k++)
{
temp.m[i][j]+=a.m[i][k]*b.m[k][j];
}
temp.m[i][j];
}
return temp;
}
私たちは自分自身に乗る所有することができ、正方形の場合は、指数演算です。
私たちは、クイックパワーを参照して、デジタル乗算行列の乗算はすぐに電源マトリクスコードを描画することができます置き換えられます。
#include<bits/stdc++.h>
using namespace std;
const int MOD=1e8+5;
const int maxn=2; //定义方阵的阶数
struct JZ{ int m[maxn][maxn]; };//定义maxn阶方阵
JZ muti(JZ a,JZ b,int mod);
JZ quick_mod(JZ a,int k,int mod);
int main()
{
JZ demo;
JZ ans;
int n;
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++) cin>>demo.m[i][j];
while(cin>>n){
ans=quick_mod(demo,n,MOD);
for(int i=0;i<maxn;i++){
for(int j=0;j<maxn;j++)
cout<<ans.m[i][j]<<' ';
cout<<endl;}
}
}
JZ muti(JZ a,JZ b,int mod)
{
JZ temp;
memset(temp.m,0,sizeof(temp.m));
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++){
for(int k=0;k<maxn;k++)
{
temp.m[i][j]+=(long long) a.m[i][k]*b.m[k][j]%mod;
}
temp.m[i][j]%=mod;
}
return temp;
}
JZ quick_mod(JZ a,int k,int mod)
{
JZ ans;
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++)
ans.m[i][j]=(i==j);
while(k) {
if(k &1) ans =muti(ans,a,mod);
a = muti(a,a,mod);
k >>=1;
}
return ans;
}
用途:マトリックスの急速な電力需要フィボナッチ数。
我々は、行列Aを定義
0 1 | |
| 1 |
Fを定義する(0)= 0、F (1)= 1。
マトリクス状行列F | 0.1 |
A行列のN番目のパワーは、Fは、第1のマトリックス乗算されるN番目のフィボナッチフィボナッチ数列です。
証明:
F.左を代表する権利行列要素によって行列は、右、左プラス右の要素が等しいです。行列乗算は、連想であるFそうX- X- ...... ...... N、X = F (X- X- X -...... X-)
異なる定義が異なることができるように行列Fフィボナッチ数。