首页 > 快速幂 + 矩阵快速幂

快速幂 + 矩阵快速幂

快速幂    

 

 1 #include
 2 #include
 3 #include
 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
 2 #include
 3 #include
 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
 2 #include
 3 #include
 4 #include
 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
 2 #include
 3 #include
 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 这条道路上的大佬超级多,但是! 好像不是但是,我是一个比较容易放弃的人哈哈哈 也可以记录一下生活呀 什么的 对伐! 耶  悄咪咪的

转载于:https://www.cnblogs.com/JiaaaaKe/p/9449880.html

更多相关:

  • L1-056 猜数字 (20 分) 一群人坐在一起,每人猜一个 100 以内的数,谁的数字最接近大家平均数的一半就赢。本题就要求你找出其中的赢家。 输入格式: 输入在第一行给出一个正整数N(≤104)。随后 N 行,每行给出一个玩家的名字(由不超过8个英文字母组成的字符串)和其猜的正整数(≤ 100)。 输出格式: 在一行中...

  • 达哥送分给我我都不要,感觉自己挺牛批。 $type=0:$ 跟visit那题类似,枚举横向移动的步数直接推公式: $ans=sum C_n^i imes C_i^{frac{i}{2}} imes C_{n-i}^{frac{n-i}{2}},i\% 2=0$ $type=1:$ 因为不能触碰负半轴,所以可以把右移看成...

  • 题目链接 题意:给你三个数n,m,k;让你构造出一个nm的矩阵,矩阵元素只有两个值(1,-1),且满足每行每列的乘积为k,问你多少个矩阵。 解法:首先,如果n,m奇偶不同,且k=-1时,必然无解: 设n为奇数,m为偶数,且首先要满足每行乘积为-1,那么每行必然有奇数个-1,那么必然会存在有偶数个-1.。满足每列乘积为-1,那么每列必...

  • Description 有 n 种数字,第 i 种数字是 ai、有 bi 个,权值是 ci。 若两个数字 ai、aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci×cj 的价值。 一个数字只能参与一次配对,可以不参与配对。 在获得的价值总和不小于 0 的前提下,求最多进行多少次配对...

  • 把字符串看作是26进制的数,从后往前翻译,那么就可以把两个串变成对应的26进制的数字,那么只要把两个数加起来除以二就得到中间的串对应的数了,同理再转化回来就行了。但是这样会有一个问题就是串的长度有2e5,26的2e5次方显然不可求,所以需要对每一位进行手动的加和运算。对于两个串,我们假设a串从后往前的每一位对应的数值为a0, a1,...

  • 中国剩余定理说白了就是小学时候的韩信点兵的完全版。给定一系列数,给定条件是一个数MOD这一些列数的结果,问你最后这个数最少为多少。 抽象出来就是N个同余方程,利用扩展GCD就可以求得这一结果,本题给定的数都是互质的,因此处理起来就简单了。 代码如下: #include #include #inc...

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...