矩陣快速冪給定乙個n*m的矩陣a和m*k的矩陣b,a×b得到乙個n*k的矩陣c。給定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 11 11 1
輸出樣例#1:
1 11 1
n<=100, k<=10^12, |矩陣元素|<=1000 演算法:矩陣快速冪
怎麼理解呢?矩陣c的某行某列就是a的某行乘以b的某列。
某行乘以某列就是行上的元素分別與列上的元素按順序相乘最後相加的結果。
所以對於矩陣c,m根本不重要,n和k決定矩陣c的大小。
那麼矩陣a和矩陣b為什麼一定要求m相等呢?
原因是如果m不等的話某行某列相乘就會有某些元素不夠乘。
什麼是單位矩陣呢?使得任意矩陣a有s*a=a的矩陣s就叫單位矩陣。相當於乘法裡的1。
單位矩陣的行數列數相等。
單位矩陣的構造就是左上開始向右下的45度斜線上的元素是1,其餘是0。
我們使用結構體加上運算子過載來實現這一操作。
1 #include2using
namespace
std;
3const
int mod=1e9+7
;4 typedef long
long
ll;5
6intn;7
struct
matrix //
初始化單位矩陣16}
17int* operator(int x)
18 matrix operator *(matrix &b)
26};
2728
intmain()
40for(int i=0;i)
45 putchar('\n'
);46}47
return0;
48 }
矩陣快速冪模板
剛學了矩陣快速冪,花了點時間把之前的 修改一下寫成了矩陣類,就當做模板了.話不多說下面貼 首先是標頭檔案和巨集定義什麼的 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取模後的...
矩陣快速冪模板
struct mat mat operator const mat c return res 上面是我的基本矩陣快速冪模板,其實矩陣快速冪難的不是你怎麼寫,難的是你矩陣怎麼構造。矩陣的構造,就是找遞推關係。要把需要用到的遞推關係包含操作矩陣上去。找到合適的初始向量和合適的操作矩陣,你基本就可以完成題...