矩陣快速冪模板 常用變式

2022-05-24 19:33:13 字數 1888 閱讀 5191

在向量乘向量的運算中,是將每個元素與它對應的元素相乘,求所有乘積之和

那麼矩陣乘矩陣是不是就是兩個同型矩陣的對應元素相乘呢?

圖樣圖森破

兩個矩陣相乘的前提是前乙個矩陣的列數等於後乙個矩陣的行數

舉個栗子,aaa為n∗kn*kn∗k矩陣,bbb為k∗mk*mk∗m矩陣,ccc為m∗nm*nm∗n矩陣,那麼aaa可以與bbb相乘,bbb可以與ccc相乘,ccc可以與aaa相乘,其他均不成立

我們知道了什麼情況下兩個矩陣可以相乘,那麼他們怎麼相乘呢?不講每個對應位置相乘還能怎麼乘呢?

設aaa為n∗kn*kn∗k矩陣,bbb為k∗mk*mk∗m矩陣,那麼它們的乘積ccc則為乙個n∗mn*mn∗m矩陣

是不是不太好理解,沒關係看看圖就知道了

在矩陣乘法中滿足以下運算律:

了解了這麼多,我們開始看題,矩陣快速冪,由於矩陣乘法滿足結合律,所以我們只需要把它按照一般的快速冪打,再過載一下運算子就可以了,好了我們直接放一道模板題:

給定n*n的矩陣a,求a^k

輸入格式:

第一行,n,k

第2至n+1行,每行n個數,第i+1行第j個數表示矩陣第i行第j列的元素

輸出格式:

輸出a^k

共n行,每行n個數,第i行第j個數表示矩陣第i行第j列的元素,每個元素模10^9+7

輸入樣例#1:複製

2 1

1 11 1

輸出樣例#1:複製

1 1

1 1

n<=100, k<=10^12, |矩陣元素|<=1000

#include#include#include#include#define mod 1000000007

using namespace std;

typedef long long int ll;

struct mat

ans,res;//用二維陣列來儲存矩陣

ll k;

ll n;

mat mul(mat x,mat y,ll n)//定義矩陣乘法,其中n是矩陣的階數

}int main()

ans,res;

mat mul(mat x,mat y)

} }return t;

}void quickmod(long long int n)

res=mul(res,res);

n>>=1;

} }

int main()

return 0;

}

斐波那契數列還有很多變式(摘自楊紫陌學長的部落格,鏈結

矩陣快速冪求long long級斐波那契(變形)。

f[n]=a*f[n-1]+b*f[n-2], f[1]=a1,f[2]=a2, mod=...

得:

其他變形:

1.f(n)=a*f(n-1)+b*f(n-2)+c;(a,b,c是常數)

2.f(n)=c^n-f(n-1) ;(c是常數)

NowCoder數列(矩陣快速冪變式)

時間限制 3000 ms 記憶體限制 32768 kb 長度限制 100 kb nowcoder最近在研究乙個數列 f 0 7 f 1 11 f n f n 1 f n 2 n 2 他稱之為nowcoder數列。請你幫忙確認一下數列中第n個數是否是3的倍數。輸入包含多組資料。每組資料報含乙個整數n,...

矩陣快速冪模板

剛學了矩陣快速冪,花了點時間把之前的 修改一下寫成了矩陣類,就當做模板了.話不多說下面貼 首先是標頭檔案和巨集定義什麼的 include include include using namespace std define inf 1000000000 define maxm 20 define m...

矩陣快速冪模板

矩陣快速冪 o log n nyoj301 580ms 時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給你乙個遞推公式 f x a f x 2 b f x 1 c 並給你f 1 f 2 的值,請求出f n 的值,由於f n 的值可能過大,求出f n 對1000007取模後的...