HDU 5015 233 Matrix
2016-03-05 15:04
447 查看
矩阵快速幂。
首先得到这个式子:
依据这个,就可以构造矩阵。
首先得到这个式子:
依据这个,就可以构造矩阵。
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; long long const MOD = 10000007; int n, m; long long a[20]; struct Matrix { long long A[20][20]; int R, C; Matrix operator*(Matrix b); }; Matrix X, Y, Z; Matrix Matrix::operator*(Matrix b) { Matrix c; memset(c.A, 0, sizeof(c.A)); int i, j, k; for (i = 1; i <= R; i++) for (j = 1; j <= b.C; j++) for (k = 1; k <= C; k++) c.A[i][j] = (c.A[i][j] + (A[i][k] * b.A[k][j]) % MOD) % MOD; c.R = R; c.C = b.C; return c; } void init() { memset(X.A, 0, sizeof X.A); memset(Y.A, 0, sizeof Y.A); memset(Z.A, 0, sizeof Z.A); Z.R = n + 2; Z.C = 1; for (int i = 1; i <= n; i++) Z.A[i][1] = a[i]; Z.A[n + 1][1] = 23; Z.A[n + 2][1] = 3; X.R = n + 2; X.C = n + 2; for (int i = 1; i <= n; i++) for (int j = 1; j <= i; j++) X.A[i][j] = 1; for (int i = 1; i <= n + 1; i++) X.A[i][n + 1] = 10; for (int i = 1; i <= n + 2; i++) X.A[i][n + 2] = 1; Y.R = n + 2; Y.C = n + 2; for (int i = 1; i <= n + 2; i++) Y.A[i][i] = 1; } void read() { for (int i = 1; i <= n; i++) { scanf("%lld", &a[i]); a[i] = a[i] % MOD; } } void work() { while (m) { if (m % 2 == 1) Y = Y*X; m = m >> 1; X = X*X; } Z = Y*Z; printf("%lld\n", Z.A [1]); } int main() { while (~scanf("%d%d", &n, &m)) { read(); init(); work(); } return 0; }
相关文章推荐
- calibre的recipe接口(API)之——参数设置
- java中Class和ClassLoader学习笔记
- JAVA枚举类型
- ELK(二)安装logstash
- 视屏的简单播放
- LINUX内核分析第二周学习总结:操作系统是如何工作的?
- [Audio processing] FFMPEG转音频格式和采样率
- cxgrid合并值相同的某列
- java常见 集合
- Java web学习(三)
- Linux命令行访问网页
- 罗马数字转十进制数
- 面试题
- php-cgi 与 php-fpm 区别?
- lnmp 快速安装
- 学习使用git时遇到的问题合集
- android启动模式小结
- HBase总结(4)--数据扫描与Scan对象
- linker command failed with exit code 1 (use -v to see invocation)(解决方案)
- 家中Win7 安装 Maven的步骤及参考文章