矩阵快速幂。先要处理出第i列每个状态下,让该状态填满,下一列可以出现的状态。因为N较大,可以矩阵加速。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-8;
void File()
{freopen("D:\\in.txt","r",stdin);freopen("D:\\out.txt","w",stdout);
}
inline int read()
{char c = getchar();  while(!isdigit(c)) c = getchar();int x = 0;while(isdigit(c)) { x = x * 10 + c - '0'; c = getchar(); }return x;
}LL n,MOD;struct Matrix
{long long A[18][18];int R, C;Matrix operator*(Matrix b);
};Matrix X, Y, Z;Matrix Matrix::operator*(Matrix b)
{Matrix c;memset(c.A, 0, sizeof(c.A));int i, j, k;for (i = 1; i <= R; i++)for (j = 1; j <= b.C; j++)for (k = 1; k <= C; k++)c.A[i][j] = (c.A[i][j] + (A[i][k] * b.A[k][j]) % MOD) % MOD;c.R = R; c.C = b.C;return c;
}void dfs(int a,int b,int t,int c)
{if(t==4) { X.A[c+1][b+1]=1; return; }if(a&(1<<t)) dfs(a,b,t+1,c);else{dfs(a|(1<<t),b|(1<<t),t+1,c);if(t+1<4&&(a&(1<<(t+1)))==0) dfs(a+(1<<t)+(1<<(t+1)),b,t+1,c);}
}void init()
{memset(X.A, 0, sizeof X.A);memset(Y.A, 0, sizeof Y.A);memset(Z.A, 0, sizeof Z.A);Y.R = 16; Y.C = 16;for (int i = 1; i <= 16; i++) Y.A[i][i] = 1;X.R = 16; X.C = 16;for(int i=0;i<=15;i++) dfs(i,0,0,i);Z.R = 1; Z.C = 16;Z.A[1][1]=1;
}void work()
{while (n){if (n % 2 == 1) Y = Y*X;n = n >> 1;X = X*X;}Z = Z*Y;printf("%lld\n",Z.A[1][16]);
}int main()
{while(~scanf("%lld%lld",&n,&MOD)){if(n==0&&MOD==0) break;n++; init();work();}return 0;
}

转载于:https://www.cnblogs.com/zufezzt/p/5740777.html

POJ 3420 Quad Tiling相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 【poj3420】 Quad Tiling

    http://poj.org/problem?id=3420 (题目链接) 题意 给出$n*m$的网格,用$1*2$的方块覆盖有多少种方案. Solution 数据很大,不能直接搞了,我们矩乘一下.0 ...

  7. POJ 2663 Tri Tiling dp 画图找规律

    状态:d[i]代表n=i时的方案数. 状态转移方程:d[i]=d[i-2]+2*(d[i-2]+d[i-4]+-+d[0]) i只会为偶数,奇数情况不存在,d[0]=1 找状态转移方程的时候画图更好理 ...

  8. 《挑战程序设计竞赛(第2版)》习题册攻略

    本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...

  9. POJ 动态规划题目列表

    1.这份列表当然不是我原创的,从文库里下载了一份,放到这里便于自己浏览和查找题目. ※最近更新:Poj斜率优化题目 1180,2018,3709 列表一:经典题目题号: 容易:  1018, 1050 ...

最新文章

  1. 三星 6.01 android操作系统耗电,三星6.01系统耗电加快是为什么
  2. html 广告 ins 原理,如何通过HTML DOM元素显示AdSense广告
  3. Python函数的参数
  4. 前端性能优化之缓存技术
  5. 中国统计网又出干货了——会员分层与顾客忠诚度分析
  6. matlab无穷积分求解_matlab编程求无穷限定积分
  7. KITTI数据集下载链接
  8. MATLAB系统辨识工具箱学习,详细教程!
  9. 英飞凌XC2000系列单片机FLASH加解密策略
  10. OpenCASCADE:OCCT应用框架OCAF之XML支持
  11. viewModel生命周期
  12. android的数据存储(3)(LitePal)
  13. gitlab找回已删除的分支
  14. IMP-00058: IMP-00000: 未成功终止导入
  15. 【历史上的今天】10 月 3 日:网络空间独立宣言之父诞生;3D 打印概念面世;eBay 收购 PayPal
  16. Debug Mac M1/M2 tensorflow:Could not find a version that satisfies the requirement tensorflow
  17. 从键盘输入10个正负相间的整数,输出个位数是奇数、十位数是偶数的所有数。
  18. 新版火狐浏览器安装xpath插件
  19. C语言—商品销售系统
  20. python pyplot颜色_更改matplotlib.pyplot点的颜色

热门文章

  1. P2689 东南西北
  2. Flask的上下文管理机制
  3. Spring Boot系列——7步集成RabbitMQ
  4. [Mvel]Mvel2.0使用指南一 基础
  5. Ubuntu 16.04安装XMind 8
  6. [禅悟人生]拿得起放得下, 才是真幸福
  7. 在 BT5 下对 Red Hat Enterprise Linux 5.4 的一次***测试
  8. FreeBSD和Linux如何互相访问文件系统
  9. 解决通过QQ客户端的空间邮箱等打开空间邮箱
  10. WebRequest 请求被中止: 请求已被取消。 错误解决方法