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 【矩阵乘法】相关推荐

  1. POj 3420 Quad Tiling 状态压缩DP+递推+矩阵快速幂

    哈哈,写了好久的,总算对了. 接下来介绍两种思路: 先介绍一种   递推+矩阵的快速幂的方法 一种DP的思想考虑4×n的最后一列  ,可以放的方法一共有5种 1.放4个 1×2  则 为dp[n-2] ...

  2. POJ 3420 Quad Tiling

    矩阵快速幂.先要处理出第i列每个状态下,让该状态填满,下一列可以出现的状态.因为N较大,可以矩阵加速. #pragma comment(linker, "/STACK:1024000000, ...

  3. 【矩阵乘法】Quad Tiling(poj 3420)

    Quad Tiling poj 3420 题目大意 在一个4×n的棋盘上,用1×2的多米诺骨牌把他填满,问有多少种方法 输入样例 1 10000 3 10000 5 10000 0 0 输出样例 1 ...

  4. POJ3420 Quad Tiling【矩阵快速幂】

    Quad Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5008 Accepted: 2269 Descripti ...

  5. 线性代数三之状压DP的矩阵加速——Quad Tiling,Bus公交线路

    状压与矩阵加速的藕断丝连 Quad Tiling description solution code [Hnoi2010]Bus 公交线路 description solution code Quad ...

  6. 【矩阵乘法】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 ...

  7. POJ3420 Quad Tiling(模板+矩阵快速幂)

    Quad Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4107 Accepted: 1878 Descripti ...

  8. poj 3233 矩阵乘法(分块矩阵)

    POJ 3233 题解:Sn为所求矩阵, 则 这样, 此题就变成了求矩阵幂和矩阵乘法, 分块矩阵乘法和普通矩阵一样的. code: /* adrui's submission Language : C ...

  9. 如何在CPU上优化GEMM矩阵乘法

    如何在CPU上优化GEMM矩阵乘法 How to optimize GEMM on CPU (TL;DR) TVM 提供抽象接口,允许用户分别描述算法和算法的实现组织(所谓的调度).通常,在高性能调度 ...

  10. HDU 2865 Birthday Toy [Polya 矩阵乘法]

    传送门 题意: 相邻珠子不能相同,旋转等价.$n$个珠子$k$中颜色,求方案数 首先中间珠子$k$种选择,$k--$ 如果没有相邻不同的限制,就和$POJ\ 2154$一样了 $|C(f)|=k^{\ ...

最新文章

  1. groupadd - 建 立 新 群 组
  2. 完整SQL分页存储过程(支持多表联接)
  3. NGUI-Tweens
  4. maven缺少jar包问题
  5. autojsui界面关闭_autojs 第九次 ui界面交互获取
  6. 利用延迟关联或者子查询优化超多分页场景
  7. saltstack php,Saltstack快速入门简单汇总
  8. Spring Boot 页面国际化
  9. Flutter ClipPath 自定义CustomClipper 玩转不一样的背景图案
  10. 文件管理器之字符和编码
  11. 一分钟搞懂 分布式与集群
  12. springcloud中文手册API
  13. GIS 矢量切片(Vector Tile)-地图定制化的时代
  14. android实现推特Twitter分享
  15. 打造前端 Deepin Linux 工作环境——安装 nodejs 环境,git 版本管理
  16. 非常精美的唐诗,无与伦比哦1
  17. C# 传递数组参数_一维数组_二维数组
  18. 《基础水文数据库》应用软件-水文预报中PA值计算
  19. 生产制造业ERP管理系统财务管理解决方案
  20. 高校房产管理系统有哪些模块?

热门文章

  1. ReactMotion Demo8 分析
  2. U-Boot在FL2440上移植(四)----支持网卡DM9000和烧写yaffs文件系统
  3. ios应用程序开发框架
  4. 学用MVC4做网站五:5.2我的文章
  5. struts2的struts.xml的详细配置1-1
  6. [Flash开发笔记] List控件--删除指定label或data的项
  7. python异步爬虫_Python异步爬虫试验[Celery,gevent,requests]
  8. 克隆硬盘后进不去系统_升级系统盘,迁移系统其实很简单
  9. 新版本chrome浏览器带来的跨域请求cookie丢失问题
  10. centos7 mysql server_centos7 mysqlserver 安装过程