快速幂 + 矩阵快速幂
快速幂
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取模的结果
输入
输入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 这条道路上的大佬超级多,但是! 好像不是但是,我是一个比较容易放弃的人哈哈哈 也可以记录一下生活呀 什么的 对伐! 耶 悄咪咪的