矩阵算法的基本题型
来源:互联网 发布:java导出压缩包 编辑:程序博客网 时间:2024/05/16 11:01
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1575
很水的模板题:
#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define maxn 101#define MOD 9973struct Mat{ int a[maxn][maxn]; Mat() {memset(a, 0, sizeof(a));} Mat(int i) { memset(a, 0, sizeof(a)); for (int i=0; i<maxn; ++i) a[i][i] = 1; }}E(1);Mat operator*(Mat a, Mat b){ Mat c; for (int i=0; i<maxn; ++i) for (int j=0; j<maxn; ++j) { c.a[i][j] = 0; for (int k=0; k<maxn; ++k) { c.a[i][j] += a.a[i][k]*b.a[k][j]; if (c.a[i][j]>=MOD) c.a[i][j] %= MOD; } } return c;}Mat operator^(Mat a, int n){ Mat ans = E, q = a; for (; n; n>>=1) { if (n&1) ans = ans*q; q = q*q; } return ans;}int main(){ int ncase, n, k, ans; Mat a; cin >> ncase; while (ncase--) { cin >> n >> k; for (int i=0; i<n; ++i) for (int j=0; j<n; ++j) cin >> a.a[i][j]; a = a^k; ans = 0; for (int i=0; i<n; ++i) ans += a.a[i][i]; ans%=MOD; cout << ans << endl; } return 0;}
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1757
构造一个
|f(10) | |a0 a1 a2 ...a8 a9| |f(9)|
| f(9) | | 1 0 0 .. . 0 0 | |f(8)|
| ..... | = | .. ......................... | | .. |
| f(2) | | 0 0 0 ... 0 0| |f(1)|
| f(1) | | 0 0 0 ... 1 0| |f(0)|
#include <iostream>#include <cstdio>using namespace std;#define N 10int MOD = 9973;struct Mat{ int mat[N][N]; Mat() { memset(mat, 0, sizeof(mat)); }}E;void get_E(Mat &a){ for (int i=0; i<N; ++i) a.mat[i][i] = 1;}Mat operator*(Mat a, Mat b){ Mat c; for (int i=0; i<N; ++i) for (int j=0; j<N; ++j) { c.mat[i][j] = 0; for (int k=0; k<N; ++k) c.mat[i][j] += (a.mat[i][k]*b.mat[k][j])%MOD; c.mat[i][j] %= MOD; } return c;}Mat operator^(Mat a, int n){ Mat ans = E, p = a; for ( ; n; n>>=1) { if (n&1) ans = ans*p; p = p*p; } return ans;}int main(){ get_E(E); int k, m, a[N]; while (cin >> k >> m) { for (int i=0; i<N; ++i) cin >> a[i]; MOD = m; if (k<10) { cout << k%m << endl; continue; } Mat p; for (int i=0; i<N; ++i) p.mat[0][i] = a[i]; for (int i=1; i<N; ++i) p.mat[i][i-1] = 1; k = k-9; p = p^k; int ans = 0; for (int i=0; i<N; i++) ans += (p.mat[0][i]*(N-1-i))%MOD; cout << ans%MOD << endl; } return 0;}
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1683
构造
3 2 7 0 f(n-1) f(n)
1 0 0 0 * f(n-2) = f(n-1)
0 1 0 0 f(n-3) f(n-2)
3 2 7 1 sum sum'
#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define maxn 4#define MOD 2009struct Mat{ int a[maxn][maxn]; Mat() {memset(a, 0, sizeof(a));} Mat(int i) { memset(a, 0, sizeof(a)); for (int i=0; i<maxn; ++i) a[i][i] = 1; }}E(1);Mat operator*(Mat a, Mat b){ Mat c; for (int i=0; i<maxn; ++i) for (int j=0; j<maxn; ++j) { c.a[i][j] = 0; for (int k=0; k<maxn; ++k) { c.a[i][j] += a.a[i][k]*b.a[k][j]; if (c.a[i][j]>=MOD) c.a[i][j] %= MOD; } } return c;}Mat operator^(Mat a, int n){ Mat ans = E, q = a; for (; n; n>>=1) { if (n&1) ans = ans*q; q = q*q; } return ans;}int main(){ int ncase, n, f[4] = {5, 3, 1, 9}; scanf("%d", &ncase); for (int k=1; k<=ncase; ++k) { scanf("%d", &n); int ans = 0; if (n<3) {// for (int i=0; i<=n; ++i)// ans += f[i]; printf("Case %d: %d\n", k, f[2-n]); } else { Mat p; p.a[0][0] = p.a[3][0] = 3; p.a[0][1] = p.a[3][1] = 2; p.a[0][2] = p.a[3][2] = 7; p.a[1][0] = p.a[3][3] = 1; p.a[2][1] = 1; n -= 2; p = p^n;// for (int i=0; i<maxn; i++)// {// for (int j=0; j<maxn; j++)// cout << p.a[i][j] << " ";// cout << endl;// } ans += (p.a[3][0]*5)%MOD; ans += (p.a[3][1]*3)%MOD; ans += (p.a[3][2]*1)%MOD; ans += (p.a[3][3]*9)%MOD; printf("Case %d: %d\n", k, ans%MOD); } } return 0;}
- 矩阵算法的基本题型
- 贪心算法基本介绍以及在lintcode上的典型题型
- 算法题型的个人练习_01
- 算法题型的个人练习_02
- 算法题型的个人练习_03
- 矩阵快速幂题型
- 调查圈新题型:含下拉菜单的矩阵题型(Matrix of Drop-down Menus)
- hdu1559,1081最大子矩阵和的两种题型
- 一类常见的矩阵快速幂题型 总结
- 基本矩阵的基本解法之8点算法
- ACM 题型算法分类
- 贪心算法 题型总结
- [算法]矩阵的基本运算(Java实现)
- 线段树基本题型总结
- Java程序员面试基本题型
- 矩阵的基本使用
- C语言之基本算法33—矩阵的基本运算
- ACM 题型算法分类总结
- 删除数组中的一个数
- 粉色地方
- Java压缩技术(四) GZIP——Java原生实现
- Java初学(一)——J2SE之基础语法
- 16,标准C
- 矩阵算法的基本题型
- pc端手机短信发送的介绍
- VC获取网页标题,解决乱码问题
- 九度-1163 素数
- 临时优化 可靠UDP程序
- poj2891 中国剩余定理
- UVA - 10271 Chopsticks
- LoadRunner 性能测试脚本
- 生产者-消费者生产模式 在医疗器械当中的使用