历史性的时刻!!!

推了一晚上!和hyc一起萌萌哒地推出来了!!

被摧残蹂躏的智商啊!!!

然而炒鸡高兴!!

(请不要介意蒟蒻的内心独白。。)

设a[i]为扫到第i行时的方案数。

易知,对于一行1*4的格子,只有一种方案把它铺满。

首先,对于当前的第i行,如果它不和第i-1行有联系(也就是它是独立的一行),那么就有1*a[i-1]=a[i-1]种方案。

如果第i行和第i-1行有联系(2行间互相联系),那么共有一下四种方案:

如果第i行、第i-1行、第i-2行都有联系(3行间两两联系),那么共有两种方案(此图以及的轴对称图形):

如果第i行、第i-1行、第i-2行、第i-3行都有联系(4行间两两联系),那么共有三种方案(上面两种方案加下面一种):

……

一直递推下去,我们可以发现:

2行间相互联系 --> 4种方案

3行间相互联系 --> 2种方案

4行间相互联系 --> 3种方案

……

奇数行相互联系(n>2) --> 2种方案

偶数行相互联系(n>2) --> 3种方案

所以,我们可以得出:

a[i]=a[i-1]+4*a[i-2]+2*(a[i-3]+a[i-5]+……+a[(i&1)?0:1])+3*(a[i-4]+a[i-6]+……+a[(i&1)?1:0]);

设s=a[i-3]+a[i-5]+……+a[(i&1)?0:1],t=a[i-4]+a[i-6]+……+a[(i&1)?1:0];

该递推式可以转化为矩阵乘法:

代码如下:

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. using namespace std;
  6.  
  7. const int N=;
  8. int Mod;
  9. struct node{
  10. int s[][];
  11. int sx,sy;
  12. };
  13.  
  14. node mult(node a,node b)
  15. {
  16. node t;
  17. t.sx=a.sx;t.sy=b.sy;
  18. memset(t.s,,sizeof(t.s));
  19. for(int i=;i<=a.sx;i++)
  20. for(int j=;j<=b.sy;j++)
  21. for(int k=;k<=a.sx;k++)
  22. {
  23. t.s[i][j]+=(a.s[i][k]*b.s[k][j])%Mod;
  24. t.s[i][j]%=Mod;
  25. }
  26. return t;
  27. }
  28.  
  29. void quickpow(int n)
  30. {
  31. if(n==) {printf("0\n");return ;}
  32. node a;
  33. a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod;
  34. a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod;
  35. a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod;
  36. a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod;
  37. a.sx=;a.sy=;
  38. node b;
  39. b.s[][]=b.s[][]=b.s[][]=b.s[][]=%Mod;
  40. b.s[][]=b.s[][]=b.s[][]=%Mod;
  41. b.s[][]=b.s[][]=b.s[][]=%Mod;
  42. b.s[][]=b.s[][]=b.s[][]=%Mod;
  43. b.s[][]=b.s[][]=b.s[][]=%Mod;
  44. b.sx=;b.sy=;
  45. while(n)
  46. {
  47. if(n&) b = mult(a,b);
  48. a = mult(a,a);
  49. n>>=;
  50. }
  51. node c;
  52. c.sx=;c.sy=;
  53. c.s[][]=%Mod;c.s[][]=c.s[][]=c.s[][]=%Mod;
  54. c = mult(b,c);
  55. printf("%d\n",c.s[][]);
  56. return ;
  57. }
  58.  
  59. int main()
  60. {
  61. while()
  62. {
  63. int x;
  64. scanf("%d%d",&x,&Mod);
  65. if(x==) return ;
  66. quickpow(x);
  67. }
  68. return ;
  69. }

【poj3420】递推式转矩阵乘法的更多相关文章

  1. HDU 1757 A Simple Math Problem 【矩阵经典7 构造矩阵递推式】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=1757 A Simple Math Problem Time Limit: 3000/1000 MS (J ...

  2. P1067Warcraft III 守望者的烦恼(十大矩阵问题之七求递推式)

    https://vijos.org/p/1067 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫“闪烁”,这个技能可以把她 ...

  3. HDU-6185-Covering(推递推式+矩阵快速幂)

    Covering Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  4. 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式

    矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b     *     A B   =   a*A+b*C  a*c+b*D c d     ...

  5. [题解][SHOI2013]超级跳马 动态规划/递推式/矩阵快速幂优化

    这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你 ...

  6. hdu 1757 A Simple Math Problem (构造矩阵解决递推式问题)

    题意:有一个递推式f(x) 当 x < 10    f(x) = x.当 x >= 10  f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + ...

  7. HDU - 2604 Queuing(递推式+矩阵快速幂)

    Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  8. HDU5950 Recursive sequence 非线性递推式 矩阵快速幂

    题目传送门 题目描述:给出一个数列的第一项和第二项,计算第n项. 递推式是 f(n)=f(n-1)+2*f(n-2)+n^4. 由于n很大,所以肯定是矩阵快速幂的题目,但是矩阵快速幂只能解决线性的问题 ...

  9. POJ 3734 Blocks(矩阵快速幂+矩阵递推式)

    题意:个n个方块涂色, 只能涂红黄蓝绿四种颜色,求最终红色和绿色都为偶数的方案数. 该题我们可以想到一个递推式 .   设a[i]表示到第i个方块为止红绿是偶数的方案数, b[i]为红绿恰有一个是偶数 ...

随机推荐

  1. jetbraints激活码

    G91XMO9AVI-eyJsaWNlbnNlSWQiOiJHOTFYTU85QVZJIiwibGljZW5zZWVOYW1lIjoic29uZyB3YW5nIiwiYXNzaWduZWVOYW1lI ...

  2. linux基础重要命令小节

    此为L005&&L006课程内容的一个总结. 命令: 基本形式 命令 [参数] [路径或文件] 例:ls -ld /data pwd 目前所在目录 [root@moban /]# pw ...

  3. OSI七层模型加协议

    OSI七层网络模型 TCP/IP四层概念模型 对应网络协议 应用层(Application) 应用层 HTTP.TFTP, FTP, NFS, WAIS.SMTP 表示层(Presentation) ...

  4. 项目总结(一)->项目的七宗罪

    大半夜来这一份总结,心中夹杂着各种各样的心情,酸甜苦辣都有,今天为止,整个项目终于完结了,对于这样一个本可以正而八经吃吃薯片,看看毛片就可以完成项目,最后演变成一个一月之内连续加班105个小时的项目, ...

  5. vue2.0 $emit $on组件通信

    在vue1.0中父子组件通信使用$dispatch 和 $broadcast,但是在vue2.0中$dispatch 和 $broadcast 已经被弃用. 因为基于组件树结构的事件流方式实在是让人难 ...

  6. CCF-NOIP-2018 提高组(复赛) 模拟试题(三)

    T1 取球游戏 问题描述 现有\(N\)个小球,依次编号为\(1\)到\(N\),这些小球除了编号以外没有任何区别.从这\(N\)个小球中取出\(M\)个,请问有多少种取球方案使得在取出的\(M\)个 ...

  7. 03-Mysql数据库----安装与管理

    本节掌握内容: mysql的安装.启动 mysql破解密码 统一字符编码 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的 ...

  8. LB

    LB(LBaaS)及Load Balance as a Service是 Neutron 提供的一项高级网络服务. LBaaS 允许租户在自己的网络中创建和管理 load balancer,load ...

  9. ardupilot_gazebo仿真(二)

    ardupilot_gazebo仿真(二) 标签(空格分隔): 未分类 在模型中添加sensor gezebo官网-sensor部分教程 gezebo官网-基础部分教程 Gazebo plugins ...

  10. Linux SPI总线和设备驱动架构之三:SPI控制器驱动

    通过第一篇文章,我们已经知道,整个SPI驱动架构可以分为协议驱动.通用接口层和控制器驱动三大部分.其中,控制器驱动负责最底层的数据收发工作,为了完成数据的收发工作,控制器驱动需要完成以下这些功能:1. ...