矩阵快速幂
来源:互联网 发布:jsp音乐网站源码 编辑:程序博客网 时间:2024/06/06 16:40
1、HDU 1757 A Simple Math Problem
参考:http://www.cnblogs.com/wally/archive/2013/03/01/2938305.html
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <queue>#include <vector>#include <stack>#include <map>#include <cmath>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef unsigned int uint;const int mod = 1e9 + 7;const int INF = 0x7fffffff;int k, m;struct Matrix { int det[10][10];};Matrix matrix;Matrix Mul(Matrix x, Matrix y);Matrix Pow(int n);int main(){#ifdef __AiR_H freopen("in.txt", "r", stdin);#endif // __AiR_H while (scanf("%d%d", &k, &m) != EOF) { for (int i = 0; i < 10; ++i) { scanf("%d", &matrix.det[0][i]); } for (int i = 1; i < 10; ++i) { for (int j = 0; j < 10; ++j) { if (i == (j + 1)) { matrix.det[i][j] = 1; } else { matrix.det[i][j] = 0; } } } if (k < 10) { printf("%d\n", k%m); } else { Matrix t = Pow(k - 9); int ans = 0; for (int i = 0; i < 10; ++i) { ans += t.det[0][i] * (9 - i); ans %= m; } printf("%d\n", ans); } } return 0;}Matrix Mul(Matrix x, Matrix y) //矩阵乘法{ Matrix ret; for (int i = 0; i < 10; ++i) { for (int j = 0; j < 10; ++j) { ret.det[i][j] = 0; for (int k = 0; k < 10; ++k) { ret.det[i][j] += x.det[i][k] * y.det[k][j]; } ret.det[i][j] %= m; } } return ret;}Matrix Pow(int n) //快速幂{ if (n == 1) { return matrix; } if (n & 1) { return Mul(matrix, Pow(n - 1)); } Matrix t = Pow(n >> 1); return Mul(t, t);}
2、HDU 1575 Tr A
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <queue>#include <vector>#include <stack>#include <map>#include <cmath>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef unsigned int uint;const int mod = 9973;const int INF = 0x7fffffff;struct Matrix { int det[20][20];};int n, k;Matrix matrix;Matrix Mul(Matrix x, Matrix y);Matrix Pow(int n);int main(){#ifdef __AiR_H freopen("in.txt", "r", stdin);#endif // __AiR_H int T; scanf("%d", &T); while (T--) { scanf("%d%d", &n, &k); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { scanf("%d", &matrix.det[i][j]); } } Matrix t = Pow(k); int ans = 0; for (int i = 0; i < n; ++i) { ans += t.det[i][i]; ans %= mod; } printf("%d\n", ans); } return 0;}Matrix Mul(Matrix x, Matrix y) //矩阵乘法{ Matrix ret; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { ret.det[i][j] = 0; for (int k = 0; k < n; ++k) { ret.det[i][j] += x.det[i][k] * y.det[k][j]; } ret.det[i][j] %= mod; } } return ret;}Matrix Pow(int n) //快速幂{ if (n == 1) { return matrix; } if (n & 1) { return Mul(matrix, Pow(n - 1)); } Matrix t = Pow(n >> 1); return Mul(t, t);}
3、XTU 1243 2016
解题思路:
先对 2016 取模,然后再矩阵快速幂
注意:写重定向会 CE
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <queue>#include <vector>#include <stack>#include <map>#include <cmath>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef unsigned int uint;const int mod = 7;const int INF = 0x7fffffff;const int maxn = 1e5 + 10;char s[maxn];struct Matrix { int det[20][20];};Matrix matrix;Matrix Mul(Matrix x, Matrix y);Matrix Pow(int n);int main(){ while (scanf("%s", s) != EOF) { int len = strlen(s); int n = 0; for (int i = 0; i < len; ++i) { n = n*10 + s[i] - '0'; n %= 2016; } for (int i = 0; i < 2; ++i) { for (int j = 0; j < 2; ++j) { scanf("%d", &matrix.det[i][j]); } } if (n == 0) { printf("1 0\n"); printf("0 1\n"); } else { Matrix t = Pow(n); for (int i = 0; i < 2; ++i) { printf("%d %d\n", t.det[i][0], t.det[i][1]); } } } return 0;}Matrix Mul(Matrix x, Matrix y) //矩阵乘法{ Matrix ret; for (int i = 0; i < 2; ++i) { for (int j = 0; j < 2; ++j) { ret.det[i][j] = 0; for (int k = 0; k < 2; ++k) { ret.det[i][j] += x.det[i][k] * y.det[k][j]; } ret.det[i][j] %= mod; } } return ret;}Matrix Pow(int n) //快速幂{ if (n == 1) { return matrix; } if (n & 1) { return Mul(matrix, Pow(n - 1)); } Matrix t = Pow(n >> 1); return Mul(t, t);}
4、郭姐散步(二)
注意:需要判断n<0的情况(因为这个一直wa,自己人出的题也这么坑啊QwQ。。。
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <queue>#include <vector>#include <stack>#include <map>#include <set>#include <cmath>#include <cctype>#include <ctime>#include <cassert>using namespace std;#define REP(i, n) for (int i = 0; i < (n); ++i)#define eps 1e-9typedef long long ll;typedef pair<int, int> pii;const int INF = 0x7fffffff;const ll mod = 1e9 + 7;struct Matrix { ll det[2][2];};Matrix ans;Matrix matrix;Matrix mul(Matrix x, Matrix y);void slove(ll n);int main() {#ifdef __AiR_H freopen("in.txt", "r", stdin);#endif // __AiR_H ll n; int T; scanf("%d", &T); while (T--) { matrix.det[0][0] = 2; matrix.det[0][1] = 1; matrix.det[1][0] = 1; matrix.det[1][1] = 0; ans.det[0][0] = 3; ans.det[0][1] = 0; ans.det[1][0] = 1; ans.det[1][1] = 0; scanf("%lld", &n); if (n < 0) { printf("0\n"); continue; } if (n > 1) { slove(n - 1); printf("%lld\n", ans.det[0][0]); continue; } if (n == 0) { printf("1\n"); continue; } printf("3\n"); }#ifdef __AiR_H printf("Time used = %.2fs\n", (double)clock() / CLOCKS_PER_SEC);#endif // __AiR_H return 0;}Matrix mul(Matrix x, Matrix y) { Matrix ret; memset(ret.det, 0, sizeof(ret.det)); for (int i = 0; i < 2; ++i) { for (int j = 0; j < 2; ++j) { for (int k = 0; k < 2; ++k) { ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod; } } } return ret;}void slove(ll n) { while (n) { if (n & 1) { ans = mul(matrix, ans); } matrix = mul(matrix, matrix); n >>= 1; }}
0 0
- 快速矩阵快速幂
- 转移矩阵+矩阵快速幂
- 矩阵乘法 矩阵快速幂
- 构造矩阵+矩阵快速幂
- 矩阵快速幂,矩阵加法,矩阵乘法
- 快速幂||矩阵快速幂
- 快速幂&矩阵快速幂
- 快速幂,矩阵快速幂
- 快速幂 矩阵快速幂
- 快速幂&矩阵快速幂
- 【快速幂】【矩阵快速幂】
- 快速幂和快速矩阵
- poj3070--矩阵 快速幂
- POJ3233矩阵快速幂
- poj3070Fibonacci 矩阵快速幂
- 矩阵的快速幂
- 矩阵快速幂
- 矩阵的快速幂
- 安卓自定义控件,禁止弹出系统软键盘和第三方软键盘
- 计算机专用英语词汇1500词
- cocos-js,屏幕适配
- fiddler2抓包工具使用图文教程
- jQuery中顺序执行fuction,队列方式实现
- 矩阵快速幂
- ORACLE 专用服务器模式(DEDICATED)与共享服务器模式(SHARE)的区别
- Alljoyn 概述(2)
- Qt依赖VTK编程小问题
- 数据库原理(六)--关系数据理论
- memcimp
- iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>
- Javascript面向对象编程二
- JAVA 反射机制简单运用