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個資料,每個資料的範圍...