P3390 矩陣快速冪

2022-02-19 05:54:13 字數 1602 閱讀 2979

這個題根據題目也就能知道應該怎麼做,但是**怎麼實現矩陣乘法,是乙個問題,所以就用到了過載運算子。

過載運算子可以定義一些普通的運算,比如   + ,-,×,÷,%,,!=,……有很多,但不能自己創造符號。

在這個題中,需要定義矩陣乘法,在定義之前,還要定義乙個結構體:

1

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 }

結構體中包含乙個二維陣列,用來表示矩陣。其中第8行之後就是定義過載運算子 * 的**。

過載運算子語法格式:返回型別(結構體),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取模,所以乘法中應該每步都取模,防止數太大。

過載運算子定義好後,就到了快速冪:

1

for(int i=1;i<=n;++i)25

while(k>0) 6

r是乙個單位矩陣,k是指數,while中因為r,t都是hls型別的,所以會自動呼叫過載運算子。

最終,r 就是結果,輸出 r 就可以。

完整**:

1 #include2

using

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 輸入輸出樣例 輸...