快速幂,矩阵快速幂

 1 const ll mod = 1e9+7;
 2 ll _power(ll a, int b, int p) { //计算(a^b)%p;
 3     ll ans = 1;
 4     while (b) {
 5         if (b & 1)
 6             ans = ans * a % p;
 7         a = a * a % p; 
 8         b >>= 1;
 9     }
10     return ans;
11 }
12 
13 struct Mat {
14     ll m[maxn][maxn];
15 }ans, a; //ans为结果矩阵,a为输入矩阵
16 Mat Mul(Mat a, Mat b, int n) {//计算矩阵a乘矩阵b,n为矩阵的大小
17     Mat c;
18     memset(c.m, 0, sizeof(c.m));
19     for (int i = 1; i <= n; i++)
20         for (int j = 1; j <= n; j++)
21             for (int k = 1; k <= n; k++)
22                 c.m[i][j] = (c.m[i][j] + (a.m[i][k] * b.m[k][j]) % mod) % mod;
23     return c;
24 }
25 Mat _power(Mat a, int b, int n) {//计算a^b,n为矩阵的大小
26     for (int i = 1; i <= n; i++)
27         ans.m[i][i] = 1;
28     while (b) {
29         if (b & 1)
30             ans = Mul(ans, a, n);
31         a = Mul(a, a, n);
32         b >>= 1;
33     }
34     return ans;
35 }

 

posted @ 2020-02-05 13:45  Kiana-  阅读(98)  评论(0)    收藏  举报