历史性的时刻!!!

推了一晚上!和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];

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

代码如下:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std; const int N=;
int Mod;
struct node{
int s[][];
int sx,sy;
}; node mult(node a,node b)
{
node t;
t.sx=a.sx;t.sy=b.sy;
memset(t.s,,sizeof(t.s));
for(int i=;i<=a.sx;i++)
for(int j=;j<=b.sy;j++)
for(int k=;k<=a.sx;k++)
{
t.s[i][j]+=(a.s[i][k]*b.s[k][j])%Mod;
t.s[i][j]%=Mod;
}
return t;
} void quickpow(int n)
{
if(n==) {printf("0\n");return ;}
node a;
a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod;
a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod;
a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod;
a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod,a.s[][]=%Mod;
a.sx=;a.sy=;
node b;
b.s[][]=b.s[][]=b.s[][]=b.s[][]=%Mod;
b.s[][]=b.s[][]=b.s[][]=%Mod;
b.s[][]=b.s[][]=b.s[][]=%Mod;
b.s[][]=b.s[][]=b.s[][]=%Mod;
b.s[][]=b.s[][]=b.s[][]=%Mod;
b.sx=;b.sy=;
while(n)
{
if(n&) b = mult(a,b);
a = mult(a,a);
n>>=;
}
node c;
c.sx=;c.sy=;
c.s[][]=%Mod;c.s[][]=c.s[][]=c.s[][]=%Mod;
c = mult(b,c);
printf("%d\n",c.s[][]);
return ;
} int main()
{
while()
{
int x;
scanf("%d%d",&x,&Mod);
if(x==) return ;
quickpow(x);
}
return ;
}

最新文章

  1. Linux学习日记-使用EF6 Code First(四)
  2. php基础_函数和类
  3. 【原创】安装LoadRunner12.53 版本时出现Critical error的解决方法
  4. 基于@AspectJ配置Spring AOP之一--转
  5. 解决Visual Stuido 2013中Xamarin的*.axml文件没有智能提示问题
  6. Day Tips:分布式缓存的删除和重建
  7. 解决play-1.4.0在linux或mac下提示No such file or directory的问题
  8. C++的那些事:容器和泛型算法
  9. Garlands
  10. mediawiki 的使用 2
  11. 从修复 testerhome(rubychina)网站的一个 bug 学习 ruby&amp;rails on ruby
  12. Java实现文件拷贝的4种方法.
  13. Android 自定义属性(attrs.xml,TypedArray)
  14. ZendStudio快捷键 注释的快捷键
  15. Spring——scope详解(转载)
  16. MySQL---事务知识,你搞明白没有?
  17. cocos creator主程入门教程(四)—— 网络通信
  18. linux 压缩和解压缩
  19. ConcurrentLinkedQueue源码解读
  20. [题目] Luogu P3707 [SDOI2017]相关分析

热门文章

  1. RHCE7认证学习笔记17——KickStart安装系统
  2. Java 基础------16进制转2进制
  3. Unity 3d C#和Javascript脚本互相调用 解决方案(非原创、整理资料,并经过实践得来)
  4. Navicat oracle to postgresql ERR
  5. WOW.js 的使用方法
  6. Spring实战第一章学习笔记
  7. Hadoop伪分布式集群
  8. CentOS环境安装JDK(二)
  9. ardupilot_gazebo仿真(三)
  10. PAT java大数 A+B和C