快速幂 + 矩阵快速幂

快速幂    

 

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define LL long long
 5 using namespace std;
 6 
 7 LL Pow(LL a, LL b)
 8 {
 9     LL ans = 1;
10     while(b != 0){
11         if(b&1)
12             ans *= a;
13         a *= a;
14         b >>= 1;
15     }
16     return ans;
17 }
18 int main()
19 {
20     LL a, b;
21     cin >> a >> b; 
22     cout << Pow(a,b) << endl;
23     return 0;
24 }

 

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define LL long long
 5 using namespace std;
 6 const LL mod = 1e9+7;
 7 
 8 LL Pow(LL a, LL b)
 9 {
10     LL ans = 1;
11     while(b != 0){
12         if(b&1){
13             ans *= a;
14             ans %= mod;
15         }
16         a *= a;
17         a %= mod;
18         b >>= 1;
19     }
20     return ans;
21 }
22 int main()
23 {
24     LL a, b;
25     cin >> a >> b; 
26     cout << Pow(a,b) << endl;
27     return 0;
28 }

 

 

 

矩阵快速幂

   模板! (自己敲了一遍 只是感觉有些乱 就把ff的记上

 

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 typedef long long LL;
 7 const int N = 105;
 8 const LL mod = 1e9 + 7;
 9 LL n, m;
10 struct mac {
11     LL c[N][N];
12     void reset() {
13         memset(c, 0, sizeof(c));
14         for (int i = 1; i <= n; i++)
15             c[i][i] = 1;
16     }
17 };
18 mac multi(mac a, mac b) 
19 {
20     mac ans;
21     for (int i = 1; i <= n; i++)
22         for (int j = 1; j <= n; j++) {
23             ans.c[i][j] = 0;
24             for (int k = 1; k <= n; k++) {
25                 ans.c[i][j] += (a.c[i][k] * b.c[k][j]) % mod;
26                 ans.c[i][j] %= mod;
27             }
28         }
29     return ans;
30 }
31 mac Pow(mac a, LL b) 
32 {
33     mac ans; ans.reset();
34     while (b) {
35         if (b & 1) 
36             ans = multi(ans, a);
37         a = multi(a, a);
38         b >>= 1;
39     }
40     return ans;
41 }
42 int main()
43 {
44     ios::sync_with_stdio(false);
45     while (cin >> n >> m) {
46         mac a;
47         for (int i = 1; i <= n; i++)
48             for (int j = 1; j <= n; j++)
49                 cin >> a.c[i][j];
50         a = Pow(a, m);
51         for (int i = 1; i <= n; i++) {
52             for (int j = 1; j < n; j++)
53                 cout << a.c[i][j] << " ";
54             cout << a.c[i][n] << endl;
55         }
56     }
57     return 0;
58 }

 

[应用](矩阵快速幂

 

4267: 二元数列

时间限制: 1 Sec  内存限制: 128 MB

题目描述

已知:


输入x0,y0,a,b,c,d,n
输出xn,yn对20181225取模的结果

输入

输入x0,y0,a,b,c,d,n

输出

输出xn,yn对20181225取模的结果

样例输入

7 6 5 4 3 2 1

样例输出

59 33

提示

0<=x0,y0,a,b,c,d<=1e3

0<=n<=8e8

 

解:虽然我此时此刻很想打死旁边的猪 可是不得不承认这个题 ,是他教的

       先推出 Xn+1 = (a²+bc)Xn-1 + (ab+bd)Yn-1;

           Yn+1 = (ac+cd)Xn-1 + (bc+d²)Yn-1;        取系数为一个矩阵,你就会发现系数是由Xn Yn系数的平方求来的, 然后推推就知道  题目求是一个矩阵的n次方  由于n太大,所以采用矩阵快速幂来求出最后Xn Yn的系数,最后求得答案。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define LL long long
 5 using namespace std;
 6 const LL mod = 20181225;
 7 struct node{
 8     LL m[2][2];
 9     void reset(){
10         memset(m,0,sizeof(m));
11         m[0][0] = 1;
12         m[1][1] = 1;
13     }
14 };
15 LL xx, yy, a, b, c, d, n, x, y;
16 
17 node multi(node a, node b)
18 {
19     node ans; ans.reset();
20     ans.m[0][0] = 0; ans.m[1][1] = 0;
21     for(int i = 0; i < 2; i++)
22         for(int j = 0; j < 2; j++)
23             for(int k = 0; k < 2; k++){
24             ans.m[i][j] += (a.m[i][k] * b.m[k][j]) % mod;
25             ans.m[i][j] %= mod;
26     }
27     return ans;
28 }
29 node Pow(node a, LL b)
30 {
31     node ans; ans.reset();
32     while(b){
33         if(b & 1)
34             ans = multi(ans, a);
35         a = multi(a, a);
36         b >>= 1;
37     }
38     return ans;
39 }
40 int main()
41 {
42     node may;
43     while(cin >> xx >> yy >> a >> b >> c >> d >> n){
44         may.m[0][0] = a; may.m[0][1] = b;
45         may.m[1][0] = c; may.m[1][1] = d;
46         may = Pow(may,n);
47         x = (may.m[0][0] * xx + may.m[0][1] * yy) % mod;
48         y = (may.m[1][0] * xx + may.m[1][1] * yy) % mod;
49         cout << x << " " << y << endl;
50     }
51     return 0;
52

 

[后记]   啦啦啦 这是我的第一篇博客,写给自己看的博客, 以后要找些什么也会方便很多! 做个总结。希望这十分钟不是浪费,加油鸭 小菜鸟 哈哈哈哈哈  虽然我感觉8 这条道路上的大佬超级多,但是! 好像不是但是,我是一个比较容易放弃的人哈哈哈 也可以记录一下生活呀 什么的 对伐! 耶  悄咪咪的

posted @ 2018-08-09 16:36  愉也  阅读(263)  评论(0编辑  收藏  举报