整体在一个命名空间POW中,使用时应加上POW :: ****
1 namespace POW{
2 typedef int t; //使用时可将"int"修改为矩阵中存储的数据类型
3 const t MOD = t(1e9 + 7);//改为快速幂要求的模数
4
5 template <class T>
6 T powmod(T a, int n, T mod){
7 T ans = a;
8 --n;
9 while(n){
10 if(n & 1)ans = ans * a % MOD;
11 a = a * a % MOD;
12 n >>= 1;
13 }
14 return ans;
15 }
16 //powmod(T a, int n, T mod)
17
18 struct Mat{
19 t a, b, c, d;//需要时可以改成二维数组并修改下面函数
20 Mat(t w,t x,t y,t z):a(w),b(x),c(y),d(z){}
21 Mat operator *(Mat &B)const{
22 t w, x, y, z;
23 w = (((LL)a * B.a)%MOD + ((LL)b * B.c)%MOD)%MOD;
24 x = (((LL)a * B.b)%MOD + ((LL)b * B.d)%MOD)%MOD;
25 y = (((LL)c * B.a)%MOD + ((LL)d * B.c)%MOD)%MOD;
26 z = (((LL)c * B.b)%MOD + ((LL)d * B.d)%MOD)%MOD;
27 return Mat(w, x, y, z);
28 }
29 };//struct Mat
30
31 }//namespace POW