矩阵快速幂模板
2015-07-31 13:16
489 查看
struct Matrix { int n , m ; int mat[M][M] ; int * operator [] (int x) { return mat[x] ; } } Matrix mul (Matrix x , Matrix y) { Matrix res ; memset (res.mat , 0 , sizeof(res.mat)) ; res.n = x.n , res.m = y.m ; for (int i = 0 ; i < x.n ; i ++) { for (int j = 0 ; j < y.m ; j ++) { for (int k = 0 ; k < x.m ; k ++) { ll tmp = x[i][k] * y[k][j] ; res[i][j] += tmp ; } } } return res ; }
#include <bits/stdc++.h> using namespace std; typedef long long li; const int N = 100 + 5; const li INF = li(1e15); typedef li mt ; int n, a ; li T; mt d, dt; void one(mt a) { for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) a[i][j] = 0; } void copy(const mt a, mt b) { for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) b[i][j] = a[i][j]; } void mul(const mt a, const mt b, mt c) { for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) { c[i][j] = -INF; for (int k = 0; k < n; ++k) c[i][j] = max(c[i][j], a[i][k] + b[k][j]); } } mt t, r; void binpow(const mt a, li b, mt c) { copy(a, t); one(c); while (b) { if (b & 1) { mul(c, t, r); copy(r, c); } mul(t, t, r); copy(r, t); b >>= 1; } } int main() { cin >> n >> T; for (int i = 0; i < n; ++i) cin >> a[i]; for (int s = 0; s < n; ++s) { for (int i = 0; i < n; ++i) { if (a[i] < a[s]) { d[s][i] = -INF; } else { d[s][i] = 1; for (int j = 0; j < i; ++j) if (a[j] <= a[i]) d[s][i] = max(d[s][i], d[s][j] + 1); } } } binpow(d, T, dt); li res = 0; for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) res = max(res, dt[i][j]); cout << res << endl; return 0; }
相关文章推荐
- 技术博客搬迁通知 - 赵雷彧
- 使用Hexo在Github上搭建自己的博客
- 子字符串替换
- HDU--5327 Olympiad
- 第一章 :绪论-Twitter数据的收集和处理
- checkbox 选中按钮可用,未选中按钮不可用
- zoj 1508 Intervals 差分约束系统
- Android maxEms和maxLength
- HDOJ 1003 ( Max Sum )
- 微信支付参考资料。
- zoj 1508 Intervals 差分约束系统
- Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If
- 11. Window open() 方法
- Apache 代理服务的配置方法
- 【随行笔记】关于新浪SAE
- OA办公系统财务部工作流程
- 粤融网,新的起点
- 10分钟的学习,改变你的程序员生涯
- SpringBoot 中使用 Log4j
- 历届冬奥会中国金牌得主一览