poj 3420 Quad Tiling 状压dp
来源:互联网 发布:搜房帮经纪人登录端口 编辑:程序博客网 时间:2024/05/22 14:18
题意:
给4*n(n<10^9)的大矩形,问有多少种用1*2的小矩形填满的方案。
分析:
又是铺瓷砖,不过这次n太大,不能再一个一个格的dp了。可以先算出相邻两行的状态转移,再用矩阵来加速n行的状态转移。
代码:
//poj 3420//sep9#include <iostream>using namespace std;const int maxN=16;struct MATRIX{__int64 m[maxN][maxN];}mat;int n,mod;void dfs(int l,int now,int pre){if(l>4) return;if(l==4){++mat.m[pre][now];return ;}dfs(l+1,(now<<1)|1,pre<<1);dfs(l+1,now<<1,(pre<<1)|1);dfs(l+2,(now<<2)|3,(pre<<2)|3);}MATRIX mul(MATRIX a,MATRIX b) { MATRIX c; memset(c.m,0,sizeof(c.m)); for(int i=0;i<16;++i) for(int j=0;j<16;++j) for(int k=0;k<16;++k){ c.m[i][j]+=a.m[i][k]*b.m[k][j]; c.m[i][j]%=mod;}return c; }MATRIX expo(MATRIX a,int k) { if(k==1)return a; MATRIX e; memset(e.m,0,sizeof(e.m)); for(int i=0;i<16;++i){e.m[i][i]=1;} if(k==0)return e; while(k) { if(k&1)e=mul(a,e); a=mul(a,a); k>>=1; } return e; } int main() { memset(mat.m,0,sizeof(mat.m)); dfs(0,0,0); while(~scanf("%d%d",&n,&mod)) { if(!n&&!mod)break; if(mod==1){printf("0\n");continue;} MATRIX ans=expo(mat,n); printf("%I64d\n",ans.m[15][15]); } return 0; }
0 0
- poj 3420 Quad Tiling 状压dp
- POJ 3420 Quad Tiling 状压DP+矩阵快速幂
- [POJ 3420]Quad Tiling(状压DP+矩阵乘法)
- poj 3420 Quad Tiling 状压dp+矩阵快速幂
- 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
- POJ 3420Quad Tiling
- POJ 3420 Quad Tiling DP?递推?+矩阵快速幂
- POJ 3420 Quad Tiling(状压DP 用矩阵快速幂优化)
- 【dp+数论】PKU-3420-Quad Tiling
- Quad Tiling - POJ 3420 矩阵递推
- POJ - 3420 Quad Tiling (矩阵快速幂)
- POJ 3420 Quad Tiling 已被翻译
- 《人物》专访庞明涛
- 数字图象处理之二维码图像提取算法(十二)
- 遗传算法
- Msm8960(APQ8064)平台的MSM-AOSP-kitkat编译适配(3):寻找正确的代码版本
- NYOJ--277 车牌号【水题】
- poj 3420 Quad Tiling 状压dp
- (API GUIDE 4)Activity(活动)
- WinForm打开文件
- 11
- Ubuntu 16.04中创建SWAP交换分区文件
- 使用seek()方法,将Hadoop文件系统中的一个文件在标准输出上显示两次
- Personal Note:Eclipse IDE for C/C++ Developers
- Msm8960(APQ8064)平台的MSM-AOSP-kitkat编译适配(4):验证代码并编写自己的device
- NYOJ--813对决【规律】