快速幂(含二阶方阵类)模板


整体在一个命名空间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

posted @ 2014-10-03 22:53  Asm.Definer  阅读(193)  评论(0编辑  收藏  举报