在向量乘向量的運算中,是將每個元素與它對應的元素相乘,求所有乘積之和
那麼矩陣乘矩陣是不是就是兩個同型矩陣的對應元素相乘呢?
圖樣圖森破
兩個矩陣相乘的前提是前乙個矩陣的列數等於後乙個矩陣的行數
舉個栗子,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取模後的...