矩陣快速冪 Tr A

2021-09-25 21:43:58 字數 1505 閱讀 7437

a為乙個方陣,則tr a表示a的跡(就是主對角線上各項的和),現要求tr(a^k)%9973。

資料的第一行是乙個t,表示有t組資料。

每組資料的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)兩個資料。接下來有n行,每行有n個資料,每個資料的範圍是[0,9],表示方陣a的內容。

對應每組資料,輸出tr(a^k)%9973

2

2 21 0

0 13 99999999

1 2 3

4 5 6

7 8 9

2

2686

&運算通常用於二進位制的取位操作,如&1就是去二進位制的最後一位

x&1==0為偶數,x&1= =1為奇數(都為1則為1,否則為0)

" >>": 去掉二進位制的最後一位(除以2,相當於x/=2)

取模運算規則(不適合除法)

a ^ b % p = ((a % p)^b) % p

(a * b) % p = (a % p * b % p) % p

(a + b) % p = (a % p + b % p) % p

(a - b) % p = (a % p - b % p+p) % p ( a>=b)

本題題意比較好理解算乙個矩陣快速冪的模板公式a ^ b % p = ((a % p)^b) % p

#include

#include

using

namespace std;

const

int mod=

9973

;int n,k;

struct mat

;//定義乙個結構體表示矩陣

mat ori,unit;

mat mul

(mat a,mat b)

//矩陣相乘

return c;}}

mat pow

(mat a,mat b,

int x)

x>>=1;

//" >>": 去掉二進位制的最後一位(除以2,相當於x/=2)

a=mul(a,a)

;//矩陣相乘

}return b;

}int

main()

} mat res=

pow(ori,ori,k-1)

;int ans=0;

for(

int i=

0;i)

ans=

(ans+res.array[i]

[i])

%mod;

//記錄((a % p)^b)

printf

("%d\n"

,ans%mod)

;//記錄a ^ b % p = ((a % p)^b) % p

}return0;

}

Tr A(矩陣快速冪)

description a為乙個方陣,則tr a表示a的跡 就是主對角線上各項的和 現要求tr a k 9973。input 資料的第一行是乙個t,表示有t組資料。每組資料的第一行有n 2 n 10 和k 2 k 10 9 兩個資料。接下來有n行,每行有n個資料,每個資料的範圍是 0,9 表示方陣a...

Tr A 矩陣快速冪

a為乙個方陣,則tr a表示a的跡 就是主對角線上各項的和 現要求tr a k 9973。input 資料的第一行是乙個t,表示有t組資料。每組資料的第一行有n 2 n 10 和k 2 k 10 9 兩個資料。接下來有n行,每行有n個資料,每個資料的範圍是 0,9 表示方陣a的內容。output 對...

Tr A(矩陣快速冪)

題目 problem description a為乙個方陣,則tr a表示a的跡 就是主對角線上各項的和 現要求tr a k 9973。input 資料的第一行是乙個t,表示有t組資料。每組資料的第一行有n 2 n 10 和k 2 k 10 9 兩個資料。接下來有n行,每行有n個資料,每個資料的範圍...