POJ3420 Quad Tiling
来源:互联网 发布:python 关闭tcp连接 编辑:程序博客网 时间:2024/05/11 21:32
题目大意:用2x1的方块铺满4xN的格子,有多少种不同的铺法。
这个题目是一个计数问题。把格子看成4列N行,假设现在要铺第n+1行(即第n行已铺满),则第n+1行有如下情况:
由图不难得出:
若令
令
则
根据定义,显然
通过矩阵的快速幂算法即可求出
#include<iostream>#include<cstring>using namespace std;struct FFF { int matrix[5][5]; FFF operator*(const FFF& nec) { FFF ret; for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) { ret.matrix[i][j] = 0; for (int k = 0; k < 5; k++) ret.matrix[i][j] += matrix[i][k] * nec.matrix[k][j]; } return ret; } FFF operator%(int mod) { FFF ret; for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) ret.matrix[i][j] = matrix[i][j] % mod; return ret; }}F = { { {1,1,1,0,1}, {2,1,0,0,0}, {1,0,0,1,0}, {0,0,1,0,0}, {1,0,0,0,0} }};int A[5] = { 1,2,1,0,1 };int main(){ int n, m; cin >> n >> m; while (n) { FFF M = F, E; memset(E.matrix, 0, sizeof(E.matrix)); for (int i = 0; i < 5; i++) E.matrix[i][i] = 1; for (int i = n - 1; i != 0; i >>= 1) { if (i & 1) E = M*E%m; M = M*M%m; } int ans = 0; for (int i = 0; i < 5; i++) ans += E.matrix[0][i] * A[i]; cout << ans%m << endl; cin >> n >> m; } return 0;}
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
- Java读取文件txt里面的内容
- java读取TXT文件的方法
- vtkAlgorithm 函数分析
- Linux进程管理:审判你的灵魂
- JAX-WS - Soap详解
- POJ3420 Quad Tiling
- Spring 使用 JDBCTemplate 的报错
- Needleman/Wunsch算法
- 深入理解http协议
- Dockerfile RUN, CMD & ENTRYPOINT
- #UIView详细显示过程
- JavaScript XML和string相互转化
- 设置eclipse黑色背景保护眼睛
- Lunix Centos 6.2 安装Mysql