這個題根據題目也就能知道應該怎麼做,但是**怎麼實現矩陣乘法,是乙個問題,所以就用到了過載運算子。
過載運算子可以定義一些普通的運算,比如 + ,-,×,÷,%,,!=,……有很多,但不能自己創造符號。
在這個題中,需要定義矩陣乘法,在定義之前,還要定義乙個結構體:
1結構體中包含乙個二維陣列,用來表示矩陣。其中第8行之後就是定義過載運算子 * 的**。struct
hls;
4hls t,r;
5long
longk;6
intn;
7const
long
long m=1000000007
;8 hls operator * (const hls &a,const hls &b)917
}18for(int x=1;x<=n;++x)
1927}28
}29return
w;30 }
過載運算子語法格式:返回型別(結構體),operator ,定義的符號,後面的括號內再寫相應的引數。
比如**中的a,b。在前面要加 取址符 &,因為如果不加,在程式中就會自行複製 a『和b』,這樣就相當於又開了兩個二維陣列,不僅耗記憶體,而且浪費時間。
在大括號內(9—30行)在其中定義結構體 w,用來儲存運算後的結果,首先將其清零,接下來用三個for迴圈,來進行矩陣的乘法運算,
w.s[x][y]就是w結構體中陣列第x行,y列的位置,所以在矩陣乘法中,w.s[x][y]的結果就是 a.s的第x行依次與b.s的第y列相乘。所以用三個迴圈就可以定義矩陣乘法。
m的值為1e9+7,題目要求每個元素對1e9+7取模,所以乘法中應該每步都取模,防止數太大。
過載運算子定義好後,就到了快速冪:
1r是乙個單位矩陣,k是指數,while中因為r,t都是hls型別的,所以會自動呼叫過載運算子。for(int i=1;i<=n;++i)25
while(k>0) 6
最終,r 就是結果,輸出 r 就可以。
完整**:
1 #include2using
namespace
std;
3struct
hls;
6hls t,r;
7long
longk;8
intn;
9const
long
long m=1000000007
;10 hls operator * (const hls &a,const hls &b)
1119}20
for(int x=1;x<=n;++x)
2129}30
}31return
w;32}33
intmain()
3442}43
for(int i=1;i<=n;++i)
4447
while(k>0
) 48
53for(int i=1;i<=n;++i)
5459 cout<
61return0;
62 }
P3390矩陣快速冪
矩陣快速冪 給定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 ...
P3390 模板 矩陣快速冪
矩陣快速冪 給定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 ...
P3390 模板 矩陣快速冪
題目背景 矩陣快速冪 題目描述 給定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 輸入輸出樣例 輸...