POJ3420 Quad Tiling
来源:互联网 发布:linux php 提权 编辑:程序博客网 时间:2024/04/29 23:28
题意不多说,直接给出公式:
得到递推矩阵:
然后用矩阵快速幂的板子飞一飞就行了。。。
要注意的是,
#include <iostream>#include <cstring>using namespace std;const int MAXN = 5;const int MAXM = 5;long long mod = 0;struct Matrix { int n, m; //n列m行 long long a[MAXN][MAXM]; Matrix() { clear(); } Matrix(int _n) { //单位矩阵 clear(); n = m = _n; for (int i = 0; i < _n; i++) a[i][i] = 1; } Matrix(const Matrix &b) { n = b.n; m = b.m; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) a[i][j] = b.a[i][j]; } void clear() { n = m = 0; memset(a, 0, sizeof(a)); } Matrix operator+(const Matrix &b) const { Matrix tmp; tmp.n = n; tmp.m = m; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) { tmp.a[i][j] = a[i][j] + b.a[i][j]; } return tmp; } Matrix operator-(const Matrix &b) const { Matrix tmp; tmp.n = n; tmp.m = m; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) tmp.a[i][j] = a[i][j] - b.a[i][j]; return tmp; } Matrix operator*(const Matrix &b) const { Matrix tmp; tmp.clear(); tmp.n = b.n; tmp.m = b.m; for (int i = 0; i < n; ++i) for (int j = 0; j < b.m; ++j) { for (int k = 0; k < m; ++k) tmp.a[i][j] = (tmp.a[i][j] + ((a[i][k] % mod) * (b.a[k][j] % mod)) % mod) % mod; } return tmp; } Matrix& operator%(const long long &mod) { for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) { a[i][j] = a[i][j]%mod; } return *this; }};Matrix pow_mod(const Matrix &a, long long i, long long n) { if (i == 0) return Matrix(4); Matrix temp = pow_mod(a, i >> 1, n); temp = temp * temp ; if (i & 1) temp = temp * a ; return temp;}//ans:(a^i)%nlong long n, m;Matrix mCoefficient, mAnsCoefficient, mF1toF4, mFn; //系数矩阵void preWork() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); mF1toF4.clear(); mF1toF4.n = 4; mF1toF4.m = 1; mF1toF4.a[0][0] = 1; mF1toF4.a[1][0] = 5; mF1toF4.a[2][0] = 11; mF1toF4.a[3][0] = 36; mCoefficient.clear(); mCoefficient.n = 4; mCoefficient.m = 4; mCoefficient.a[0][1] = mCoefficient.a[1][2] = mCoefficient.a[2][3] = mCoefficient.a[3][1] = mCoefficient.a[3][3] = 1; mCoefficient.a[3][0] = -1; mCoefficient.a[3][2] = 5;}int main() { preWork(); while (cin >> n >> m , n) { if (n > 4) { mod = m; mAnsCoefficient = pow_mod(mCoefficient, n-4, m); mFn = mAnsCoefficient * mF1toF4; mFn.a[3][0]=mFn.a[3][0]%m; while (mFn.a[3][0]<0) mFn.a[3][0]=mFn.a[3][0]+m; cout << mFn.a[3][0] << "\n"; } else { cout << mF1toF4.a[n - 1][0]%m << "\n"; } }}//f(n)=f(n-1)+5*f(n-2)+f(n-3)-f(n-4)
0 0
- POJ3420 Quad Tiling
- POJ3420 Quad Tiling
- POJ3420-Quad Tiling
- poj3420 Quad Tiling 矩阵乘法
- POJ3420 Quad Tiling DP + 矩阵快速幂
- 【Poj3420】Quad Tiling 状压DP 矩阵快速幂
- POJ3420 Quad Tiling(模板+矩阵快速幂)
- poj3420 Quad Tiling--状压dp+矩阵快速幂
- Quad Tiling
- Quad Tiling
- Quad Tiling
- poj 3420 Quad Tiling
- POJ 3420 Quad Tiling
- poj 3420 Quad Tiling
- POJ 3420 Quad Tiling
- Poj-3420 Quad Tiling
- POJ 3420 Quad Tiling
- POJ 3420 Quad Tiling
- 【POJ1562】Oil Deposits
- linux使用GDB 调试
- SpaceShooter打飞机教程笔记(二)
- 简单链表
- spark实战:对日志进行查询
- POJ3420 Quad Tiling
- 从头说12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用
- 问题锦囊之WS_MOBILE_PAY_SDK_BASE
- Android子线程中更新UI的3种方法
- HDU-5763-Another Meaning-hash加DP
- 一种基于TS包比例占用的固定码率TS流复用算法
- POJ2524 并差集以及优化(路径压缩+按秩合并)的简洁介绍
- JAVA基础----代码块的执行顺序
- hdu2571命运dfs