哈哈,写了好久的,总算对了。

接下来介绍两种思路:

先介绍一种   递推+矩阵的快速幂的方法

一种DP的思想考虑4×n的最后一列  ,可以放的方法一共有5种

1.放4个 1×2  则 为dp[n-2]

2.   放2个 2x1  则为 dp[n-1]

3.   放 1x2    2x1  1x2  则为  dp[n-2]+dp[n-4]+.....+dp[0]

4.  放 1x2  1x2  2x1 为 dp[n-2]+dp[n-3]+dp[n-4]+....+dp[0]

5.和 4 一样 的另外一种情况 所以也是 dp[n-2]+dp[n-3]+....dp[0];

所以最后结果是 dp[n]=dp[n-1]+dp[n-2]+2*(dp[n-2]+dp[n-3]+..dp[0])+dp[n-2]+dp[n-4]+...dp[0];

然后写一个dp[n-2]=.....

减一下,化简 之后的结果是dp[n]=dp[n-1]+5*dp[n-2]+dp[n-3]-dp[n-4];  这就是递推公式了

之后建立一个矩阵

( 1 5 1 -1

1 0 0 0

0 1 0 0

0 0 1 0        )

dp[0]=1,dp[1]=1,dp[2]=5,dp[3]=11  不断左乘那个矩阵 就可以转化为 那个矩阵的 幂,之后快速幂搞定!!

最后答案注意点,可能为负,那只要  (ans+m)%m  就是正确答案了!。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct matri
{long long f[4][4];
};
long long n,m;
long long dp[5];
matri mul(matri a,matri b)
{int i,j,k;matri c;memset(c.f,0,sizeof(c.f));for(i=0;i<4;i++)for(j=0;j<4;j++)for(k=0;k<4;k++)c.f[i][j]=(c.f[i][j]+a.f[i][k]*b.f[k][j])%m;return c;
}
void eps_mul(matri a,int t)
{matri s;memset(s.f,0,sizeof(s.f));s.f[0][0]=s.f[1][1]=s.f[2][2]=s.f[3][3]=1;while(t){if(t&1)s=mul(s,a);a=mul(a,a);t=t>>1;}long long ans=0;for(int i=0;i<4;i++)ans=(ans+dp[i]*s.f[0][3-i]);if((ans%=m)<0) ans=(ans+m)%m;printf("%lld\n",ans);
}
int main()
{dp[0]=1;dp[1]=1;dp[2]=5;dp[3]=11;while(scanf("%lld%lld",&n,&m),n||m){if(n<4) {printf("%lld\n",dp[n]%m);continue;}matri ss;ss.f[0][0]=1;ss.f[0][1]=5;ss.f[0][2]=1;ss.f[0][3]=-1;ss.f[1][0]=1;ss.f[1][1]=0;ss.f[1][2]=0;ss.f[1][3]=0;ss.f[2][0]=0;ss.f[2][1]=1;ss.f[2][2]=0;ss.f[2][3]=0;ss.f[3][0]=0;ss.f[3][1]=0;ss.f[3][2]=1;ss.f[3][3]=0;eps_mul(ss,n-3);}
}

接下来讲第二种状态压缩的方法

很显然会有1<<4中状态

各个状态的匹配就达到了16*16 的矩阵。

矩阵的转移快速幂的意思就是1,2   3,4是同样的。``同理。

状态的转移 很巧妙的就是矩阵的相乘,

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct matrix
{int f[16][16];
};
int n,m;
int pre[16*16],now[16*16];
int top;
void dfs(int num,int p,int q)
{if(num>4)return;if(num==4){pre[top]=q;now[top++]=p;return;}dfs(num+2,(p<<2)|3,(q<<2)|3);dfs(num+1,(p<<1)|1,q<<1);dfs(num+1,p<<1,(q<<1)|1);
}
matrix mul(matrix a,matrix b)
{matrix s;memset(s.f,0,sizeof(s.f));int i,j,k;for(i=0;i<16;i++)for(j=0;j<16;j++)for(k=0;k<16;k++)s.f[i][j]=(s.f[i][j]+a.f[i][k]*b.f[k][j])%m;return s;
}
void quick_pow(matrix A,int k)
{int i;matrix s;memset(s.f,0,sizeof(s.f));for(i=0;i<16;i++)s.f[i][i]=1;while(k){if(k&1)s=mul(s,A);A=mul(A,A);k=k>>1;}printf("%d\n",s.f[15][15]);
}
int main()
{while(scanf("%d%d",&n,&m),n||m){int i;matrix s;memset(s.f,0,sizeof(s.f));top=0;dfs(0,0,0);for(i=0;i<top;i++)s.f[pre[i]][now[i]]=1;quick_pow(s,n);}
}

所以可以写出代码

POj 3420 Quad Tiling 状态压缩DP+递推+矩阵快速幂相关推荐

  1. Happy Necklace dp 递推 矩阵快速幂

    当满足素数2和素数3的条件后,下一个素数区间5乃至之后的都会被满足. 考虑能否从f[n - 1]转换到f[n],考虑第i - 1位,如果后面加红色一定满足条件,所以f[n]先是加上f[n - 1] 如 ...

  2. 湘潭赛Easy wuxing(递推+矩阵快速幂or DP)

    湘潭赛Easy wuxing(递推+矩阵快速幂or DP) 十分感谢老师的思路! 题目描述 "五行"是中国传统哲学思想,它认为认为大自然的现象由"木.火.土.金.水&qu ...

  3. NYOJ 1075 (递推 + 矩阵快速幂)

    "红色病毒"问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 医学研究者最近发现了一种新病毒,因为其蔓延速度与曾经在Internet上传播的&qu ...

  4. HDU - 6185 Covering(暴搜+递推+矩阵快速幂/杜教BM)

    题目链接:点击查看 题目大意:规定宽度为4,给定长度为n,求用1*2和2*1的瓷砖,将其完全铺满能有多少种方法. 分析:自从学会了矩阵快速幂之后,看到1e18的数据量都会下意识的往递推上面想,但是以前 ...

  5. Recursive sequence HDU - 5950 (递推 矩阵快速幂优化)

    题目链接 F[1] = a, F[2] = b, F[i] = 2 * F[i-2] + F[i-1] + i ^ 4, (i >= 3) 现在要求F[N] 类似于斐波那契数列的递推式子吧, 但 ...

  6. 【递推矩阵快速幂】hdu 2604

    前四位我们可以算出d[1]=2,d[2]=4,d[3]=6,d[4]=9.    我们可以这样想:一个合法串可以由两个较短的合法串组成    就以d[n]为例:(注意不能重复)    1.n-1个字符 ...

  7. HDOJ 2604 Queuing (递推+矩阵快速幂)

    点击打开链接 题意:给你一个长度为L的由m和f两种字母组成的字符串,定义存在fmf以及fff子串的都是不符合要求的串,问长度为L的符合要求的串有多少个? 解题思路: 首先找出递推关系式,先给出递推关系 ...

  8. 递推+矩阵快速幂 HDU 2065

    1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace ...

  9. POJ 3420 Quad Tiling

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

最新文章

  1. python urllib.request 爬虫 数据处理-python爬虫1--urllib请求库之request模块
  2. new和make的区别
  3. Android的按钮单击事件及监听器的实现方式
  4. ActiveMQ(为什么要使用消息中间件,JMS传输模型)
  5. dubbo学习之服务消费者
  6. [摘自MSDN] ASP.Net2.0学习 [1] 母版页 2 : 创建和使用 ASP.NET 母版页
  7. table表格for循环绑定数据_.NET MVC 页面表格绘制
  8. redis 在 mac 下的安装与使用
  9. Activity singleTop启动模式
  10. Matlab函数——dct2
  11. VMware虚拟机XP系统安装
  12. Matlab中break语句
  13. 计算机显示屏知识,计算机配置知识之显示屏
  14. 阿里JAVA实习生面试总结(2019年春招)
  15. 王阳明心学感悟1——勇敢地剖析自己的内心
  16. 股市资深大牛用Python写了个股票价格实时MacOS应用程序!实时监控!
  17. ios上如何能运行android程序,怎么在ios 系统上面运行安卓软件嘛
  18. 张一鸣宣布卸任字节跳动CEO;贝壳找房创始人左晖因病去世 | 高管变动2021年5月17日-22日...
  19. 关于HTML表单用户信息进行MD5加密
  20. MDM经理如何为主要利益相关方加速创造价值 - 第一部分:消除重复的客户信息

热门文章

  1. Python的继承多态
  2. FloodFill算法详解及应用
  3. Netflix测试有线电视频道、字节11亿入股掌阅、快手香港IPO、王者荣耀日活破一亿等|Decode the Week...
  4. 如何构建分布式SFU/MCU媒体服务器?
  5. 研发效能提升最佳实践的探索
  6. 微盟数据库的涅槃之旅
  7. 大牛书单 | 人工智能方向好书推荐
  8. [ffmpeg] 解码API
  9. virtualbox中Centos6.6和windows共享文件夹设置
  10. Android O 迁移应用官方指南