首页 > 代码库 > 快速幂(含二阶方阵类)模板
快速幂(含二阶方阵类)模板
整体在一个命名空间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
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
快速幂(含二阶方阵类)模板
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。