アルゴリズムの概要狂人(v)は行列の乗算(行列高速電力)

最初は、線形代数行列乗算、行およびマトリックスのような第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フィボナッチ数。

おすすめ

転載: www.cnblogs.com/lunatic-talent/p/11306478.html