【hdu6185】Covering(骨牌覆盖)
2017ACM/ICPC广西邀请赛-重现赛1004Covering
题意
n*4的格子,用1*2和2*1的砖块覆盖。问方案数(mod 1e9+7)。(n不超过1e9)
题解
递推了个式子然后错位相减。
f[n] =f[n-1]+4f[n-2]+2f[n-3]+3f[n-4]+2f[n-5]+2f[n-6]+..+(x%2?2:3)f[n-x]
f[n-2]= f[n-3]+4f[n-4]+2f[n-5]+3f[n-6]+..+(x%2?2:3)f[n-x]
f[n] =f[n-1]+5f[n-2]+ f[n-3]-f[n-4]
再用矩阵快速幂。
另外,这题可以先用暴力的dfs或者状态压缩dp求得前几项,然后套BM板子得出递推式。
不过,官方题解的方法是状态压缩加矩阵快速幂优化:
只考虑一列的状态,0表示没有被覆盖,1表示被覆盖了,只可能有0000,1111,1001,0110,1100,0011。
dp[i][j]表示前i-1列覆盖满,第i列状态为j的方案数。考虑转移,然后a[i][j]==1就是状态i可以由状态j转移过来,那么就可以矩阵快速幂加速了。
--
51nod 上的骨牌覆盖 V2,类似。a数组可以dfs出来。
代码
typedef long long ll;
typedef vector<ll> VI;
typedef vector<VI> Mat;
const ll mod=1000000007;
Mat mul(Mat &a,Mat &b){
Mat c(SZ(a), VI(SZ(b[0])));
rep(i,0,SZ(a))rep(j,0,SZ(b[0]))rep(k,0,SZ(b))
c[i][j]=(c[i][j]+a[i][k]*b[k][j])%mod;
return c;
}
Mat qpow(Mat a,ll b){
Mat c(SZ(a), VI(SZ(a)));
rep(i,0,SZ(a))c[i][i]=1;
for(;b;b>>=1,a=mul(a,a))if(b&1)c=mul(c,a);
return c;
}
int main(){
Mat a(4,VI(4));
a[0]=VI{1,5,1,-1};
rep(i,0,3)a[i+1][i]=1;
ll n;
while(~scanf("%lld",&n)){
if(n==1)puts("1");
else if(n==2)puts("5");
else if(n==3)puts("11");
else if(n==4)puts("36");
else{
Mat c=qpow(a,n-4);
printf("%lld\n",((c[0][0]*36+c[0][1]*11+c[0][2]*5+c[0][3])%mod+mod)%mod);
}
}
return 0;
}
状态压缩
int main() {
Mat a(6,VI(6));
a[0]=VI{1,1,1,1,1,0};
a[1]=VI{1,0,0,0,0,0};
a[2]=VI{1,0,0,1,0,0};
a[3]=VI{1,0,1,0,0,0};
a[4]=VI{1,0,0,0,0,1};
a[5]=VI{0,0,0,0,1,0};
ll n;
while(~scanf("%lld",&n)){
printf("%lld\n",qpow(a,n)[0][0]);
}
return 0;
}
骨牌覆盖 V2
const int N=1<<5;
int n,m;
Mat a(N,VI(N));
void dfs(int c,int pre,int cur){
if(c>n)return;
if(c==n){
++a[pre][cur];
return;
}
dfs(c+1,pre<<1,cur<<1|1);//竖着放
dfs(c+1,pre<<1|1,cur<<1);//不能放
dfs(c+2,pre<<2,cur<<2);//横着放
}
int main() {
while(~scanf("%d%d",&m,&n)){
rep(i,0,SZ(a))rep(j,0,SZ(a[i]))a[i][j]=0;
dfs(0,0,0);
printf("%lld\n",qpow(a,m)[0][0]);
}
return 0;
}
【hdu6185】Covering(骨牌覆盖)的更多相关文章
- 随便玩玩系列之一:SPOJ-RNG+51nod 算法马拉松17F+51nod 1034 骨牌覆盖v3
先说说前面的SPOJ-RNG吧,题意就是给n个数,x1,x2,...,xn 每次可以生成[-x1,x1]范围的浮点数,把n次这种操作生成的数之和加起来,为s,求s在[A,B]内的概率 连续形的概率 假 ...
- hiho #1151 : 骨牌覆盖问题·二 (递推,数论)
#1151 : 骨牌覆盖问题·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上一周我们研究了2xN的骨牌问题,这一周我们不妨加大一下难度,研究一下3xN的骨牌问题? ...
- hiho #1143 : 骨牌覆盖问题·一 (运用快速幂矩阵)
#1143 : 骨牌覆盖问题·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题:我们有一个2xN的长条形棋盘,然 ...
- hiho42 : 骨牌覆盖问题·二
描述 上一周我们研究了2xN的骨牌问题,这一周我们不妨加大一下难度,研究一下3xN的骨牌问题?所以我们的题目是:对于3xN的棋盘,使用1x2的骨牌去覆盖一共有多少种不同的覆盖方法呢?首先我们可以肯定, ...
- hiho41 : 骨牌覆盖问题·一
原问题:骨牌覆盖问题 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题:我们有一个2xN的长条形棋盘,然后用1x2的 ...
- hihocoder第42周 3*N骨牌覆盖(状态dp+矩阵快速幂)
http://hihocoder.com/contest/hiho42/problem/1 给定一个n,问我们3*n的矩阵有多少种覆盖的方法 第41周做的骨牌覆盖是2*n的,状态转移方程是dp[i] ...
- 1007 正整数分组 1010 只包含因子2 3 5的数 1014 X^2 Mod P 1024 矩阵中不重复的元素 1031 骨牌覆盖
1007 正整数分组 将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的. Input 第1行:一个 ...
- hihoCoder 1143 : 骨牌覆盖问题·一(递推,矩阵快速幂)
[题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个2xN的长条形 ...
- hihoCoder #1143 : 骨牌覆盖问题·一
#1143 : 骨牌覆盖问题·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题:我们有一个2xN的长条形棋盘,然 ...
随机推荐
- amd,cmd规范
AMD 和 CMD 的区别有哪些? AMD规范与CMD规范的区别 回顾:前端模块化和AMD.CMD规范(全) 浅析JS模块规范:AMD,CMD,CommonJS 理解AMD ,CMD,CommonJS ...
- MySQL中关于数据类型指定宽度之后的情况
概述 MySQL有很多种数据类型,最常用的就是int,char,varchar,这些类型在创建表的时候都可以指定该字段的宽度,方法是在类型后面加一个括号,括号中写宽度就可以了. 但是,在指定宽度之后, ...
- nmon for Linux & Java
nmon for Linux | Main / HomePagehttp://nmon.sourceforge.net/pmwiki.php Java Nmon Analyser download | ...
- linux下编译upx ucl
昨天,UPX发布了3.93版本. UPX(the Ultimate Packer for eXecutables)是一个非常全面的可执行文件压缩软件,支持dos/exe.dos/com.dos/sys ...
- python 3.6.1 安装scrapy踩坑之旅
系统环境:win10 64位系统安装 python基础环境配置不做过多的介绍 window环境安装scrapy需要依赖pywin32,下载对应python版本的exe文件执行安装,下载的pywin32 ...
- Velocity中判断是否为空
方法一: 使用 #ifnull() 或 #ifnotnull() eg:#ifnull ($foo) 要使用这个特性必须在velocity.properties文件中加入: userdirective ...
- 【转帖】远程显示(操作) 服务器 GUI 程序(图形化界面) (基于 X11 Forwarding + Centos + MobaXterm)
远程显示(操作) 服务器 GUI 程序(图形化界面) (基于 X11 Forwarding + Centos + MobaXterm) https://zhuanlan.zhihu.com/p/310 ...
- IntelliJ IDEA使用教程(非常全面)
这个编辑器我就不再多做介绍了.直接开始新建maven hello world 的Java web项目啦 你电脑上得有jdk1.7,或者1.8,然后就是maven3.x吧,再有就是tomcat7以上吧. ...
- day 7-3 僵尸进程,孤儿进程与守护进程
一.基本定义 正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 当一个 进程完成它的工作终止之后,它 ...
- nodejs 利用zip-local模块压缩文件夹
var zipper = require("zip-local"); zipper.sync.zip("./folder").compress().save(& ...