poj 3420 Quad Tiling 【矩阵乘法】
http://poj.org/problem?id=3420
题目大意:求在一个4*N(N<=1000000000)的格子中放1*2的格子的方案数。
首先推导出公式f(n)=f(n-1)+5f(n-2)+f(n-3)-f(n-4),然后将其用矩阵乘法进行优化。
矩阵的转换看这里:http://www.cnblogs.com/aiiYuu/gallery/image/127131.html
然后用矩阵连乘进行运算,将复杂度降到了O(logN)。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <set> #include <map> #include <cmath> #include <queue> using namespace std; template <class T> void checkmin(T &t,T x) {if(x < t) t = x;} template <class T> void checkmax(T &t,T x) {if(x > t) t = x;} template <class T> void _checkmin(T &t,T x) {if(t==-1) t = x; if(x < t) t = x;} template <class T> void _checkmax(T &t,T x) {if(t==-1) t = x; if(x > t) t = x;} typedef pair <int,int> PII; typedef pair <double,double> PDD; typedef long long ll; #define foreach(it,v) for(__typeof((v).begin()) it = (v).begin(); it != (v).end ; it ++) const int N = 4; int n , MOD; struct Matrix {int n , m;int a[N][N];Matrix() {}Matrix(int _n,int _m):n(_n),m(_m){};void intput() {for(int i=0;i<n;i++)for(int j=0;j<m;j++)scanf("%d",&a[i][j]);}Matrix operator + (const Matrix &b) {Matrix tmp = Matrix(n,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) {Matrix tmp = Matrix(n,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) {Matrix tmp = Matrix(n,b.m);for(int i=0;i<n;i++)for(int j=0;j<b.m;j++)tmp.a[i][j] = 0;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] += a[i][k]*b.a[k][j];tmp.a[i][j] %= MOD;}return tmp;} };Matrix operator ^ (Matrix a , int p) {Matrix ret = Matrix(a.n,a.m);for(int i=0;i<a.n;i++)for(int j=0;j<a.m;j++)ret.a[i][j] = (i == j ? 1 : 0);while(p) {if(p%2) ret = ret * a;a = a * a;p /= 2;}return ret; } /* Matrix mi(Matrix a , int p) {Matrix tmp = Matrix(a.n,a.m);for(int i=0;i<a.n;i++)for(int j=0;j<a.m;j++)if(i==j) tmp.a[i][j]=1;else tmp.a[i][j]=0;if(p == 0) return tmp;if(p == 1) return a;if(p % 2) tmp = a;Matrix tt = mi(a , p/2);return tt * tt * tmp; }*/ Matrix A , h; int main() {while(~scanf("%d%d",&n,&MOD) && n+MOD) {h = Matrix(4,4);h.a[0][0]=1;h.a[1][0]=5;h.a[2][0]=11;h.a[3][0]=36;A = Matrix(4,4);A.a[0][0]=0;A.a[0][1]=1;A.a[0][2]=0;A.a[0][3]=0;A.a[1][0]=0;A.a[1][1]=0;A.a[1][2]=1;A.a[1][3]=0;A.a[2][0]=0;A.a[2][1]=0;A.a[2][2]=0;A.a[2][3]=1;A.a[3][0]=-1;A.a[3][1]=1;A.a[3][2]=5;A.a[3][3]=1;A = A ^ (n-1);A = A * h;printf("%d\n" , A.a[0][0]);}return 0; }
转载于:https://www.cnblogs.com/aiiYuu/archive/2013/04/10/3011567.html
poj 3420 Quad Tiling 【矩阵乘法】相关推荐
- POj 3420 Quad Tiling 状态压缩DP+递推+矩阵快速幂
哈哈,写了好久的,总算对了. 接下来介绍两种思路: 先介绍一种 递推+矩阵的快速幂的方法 一种DP的思想考虑4×n的最后一列 ,可以放的方法一共有5种 1.放4个 1×2 则 为dp[n-2] ...
- POJ 3420 Quad Tiling
矩阵快速幂.先要处理出第i列每个状态下,让该状态填满,下一列可以出现的状态.因为N较大,可以矩阵加速. #pragma comment(linker, "/STACK:1024000000, ...
- 【矩阵乘法】Quad Tiling(poj 3420)
Quad Tiling poj 3420 题目大意 在一个4×n的棋盘上,用1×2的多米诺骨牌把他填满,问有多少种方法 输入样例 1 10000 3 10000 5 10000 0 0 输出样例 1 ...
- POJ3420 Quad Tiling【矩阵快速幂】
Quad Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5008 Accepted: 2269 Descripti ...
- 线性代数三之状压DP的矩阵加速——Quad Tiling,Bus公交线路
状压与矩阵加速的藕断丝连 Quad Tiling description solution code [Hnoi2010]Bus 公交线路 description solution code Quad ...
- 【矩阵乘法】Matrix Power Series(poj 3233)
Matrix Power Series poj 3233 题目大意 给你一个矩阵A,让你求S=A+A2+A3+-+AkS = A + A^2 + A^3 + - + A^kS=A+A2+A3+-+Ak ...
- POJ3420 Quad Tiling(模板+矩阵快速幂)
Quad Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4107 Accepted: 1878 Descripti ...
- poj 3233 矩阵乘法(分块矩阵)
POJ 3233 题解:Sn为所求矩阵, 则 这样, 此题就变成了求矩阵幂和矩阵乘法, 分块矩阵乘法和普通矩阵一样的. code: /* adrui's submission Language : C ...
- 如何在CPU上优化GEMM矩阵乘法
如何在CPU上优化GEMM矩阵乘法 How to optimize GEMM on CPU (TL;DR) TVM 提供抽象接口,允许用户分别描述算法和算法的实现组织(所谓的调度).通常,在高性能调度 ...
- HDU 2865 Birthday Toy [Polya 矩阵乘法]
传送门 题意: 相邻珠子不能相同,旋转等价.$n$个珠子$k$中颜色,求方案数 首先中间珠子$k$种选择,$k--$ 如果没有相邻不同的限制,就和$POJ\ 2154$一样了 $|C(f)|=k^{\ ...
最新文章
- groupadd - 建 立 新 群 组
- 完整SQL分页存储过程(支持多表联接)
- NGUI-Tweens
- maven缺少jar包问题
- autojsui界面关闭_autojs 第九次 ui界面交互获取
- 利用延迟关联或者子查询优化超多分页场景
- saltstack php,Saltstack快速入门简单汇总
- Spring Boot 页面国际化
- Flutter ClipPath 自定义CustomClipper 玩转不一样的背景图案
- 文件管理器之字符和编码
- 一分钟搞懂 分布式与集群
- springcloud中文手册API
- GIS 矢量切片(Vector Tile)-地图定制化的时代
- android实现推特Twitter分享
- 打造前端 Deepin Linux 工作环境——安装 nodejs 环境,git 版本管理
- 非常精美的唐诗,无与伦比哦1
- C# 传递数组参数_一维数组_二维数组
- 《基础水文数据库》应用软件-水文预报中PA值计算
- 生产制造业ERP管理系统财务管理解决方案
- 高校房产管理系统有哪些模块?
热门文章
- ReactMotion Demo8 分析
- U-Boot在FL2440上移植(四)----支持网卡DM9000和烧写yaffs文件系统
- ios应用程序开发框架
- 学用MVC4做网站五:5.2我的文章
- struts2的struts.xml的详细配置1-1
- [Flash开发笔记] List控件--删除指定label或data的项
- python异步爬虫_Python异步爬虫试验[Celery,gevent,requests]
- 克隆硬盘后进不去系统_升级系统盘,迁移系统其实很简单
- 新版本chrome浏览器带来的跨域请求cookie丢失问题
- centos7 mysql server_centos7 mysqlserver 安装过程