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(骨牌覆盖)的更多相关文章

  1. 随便玩玩系列之一:SPOJ-RNG+51nod 算法马拉松17F+51nod 1034 骨牌覆盖v3

    先说说前面的SPOJ-RNG吧,题意就是给n个数,x1,x2,...,xn 每次可以生成[-x1,x1]范围的浮点数,把n次这种操作生成的数之和加起来,为s,求s在[A,B]内的概率 连续形的概率 假 ...

  2. hiho #1151 : 骨牌覆盖问题·二 (递推,数论)

    #1151 : 骨牌覆盖问题·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上一周我们研究了2xN的骨牌问题,这一周我们不妨加大一下难度,研究一下3xN的骨牌问题? ...

  3. hiho #1143 : 骨牌覆盖问题·一 (运用快速幂矩阵)

    #1143 : 骨牌覆盖问题·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题:我们有一个2xN的长条形棋盘,然 ...

  4. hiho42 : 骨牌覆盖问题·二

    描述 上一周我们研究了2xN的骨牌问题,这一周我们不妨加大一下难度,研究一下3xN的骨牌问题?所以我们的题目是:对于3xN的棋盘,使用1x2的骨牌去覆盖一共有多少种不同的覆盖方法呢?首先我们可以肯定, ...

  5. hiho41 : 骨牌覆盖问题·一

    原问题:骨牌覆盖问题 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题:我们有一个2xN的长条形棋盘,然后用1x2的 ...

  6. hihocoder第42周 3*N骨牌覆盖(状态dp+矩阵快速幂)

    http://hihocoder.com/contest/hiho42/problem/1 给定一个n,问我们3*n的矩阵有多少种覆盖的方法 第41周做的骨牌覆盖是2*n的,状态转移方程是dp[i] ...

  7. 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行:一个 ...

  8. hihoCoder 1143 : 骨牌覆盖问题·一(递推,矩阵快速幂)

    [题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个2xN的长条形 ...

  9. hihoCoder #1143 : 骨牌覆盖问题·一

    #1143 : 骨牌覆盖问题·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题:我们有一个2xN的长条形棋盘,然 ...

随机推荐

  1. oc之封装「可输入值」的UIStepper

    2017.07.17 18:10* 字数 66 阅读 644评论 0喜欢 5 oc之封装「可输入值」的UIStepper 最终效果 要求: Platform: iOS7.0+ Language: Ob ...

  2. sqlserver笔记

    表结构: 一,字段类型sqlserver jdbc java char char Stringnchar nchar Stringvarchar varchar Stringnvarchar nvar ...

  3. JavaScript中防止重复提交

    有这么一种情况: 页面有一个按钮,点击之后会触发Ajax请求,但是用户在点击之后,不知道是否点成功了,于是又点了一下,如果不加处理的话,就会进行两次Ajax请求,并且请求的数据都是一样的,对后端的程序 ...

  4. 【kindle笔记】之 《犬夜叉》-2017-12-26

    [kindle笔记]读书记录-总 2017-12-26 <犬夜叉> 买kindle的初衷是看计算机工具书看得眼快瞎了,我弟弟推荐给我的Linux系列<鸟叔私房菜> 真的是深思熟 ...

  5. mysql 无法退出sql命令行编辑

    mysql 无法退出sql命令行编辑 | ANBOBhttp://www.anbob.com/archives/579.html mysql 无法退出sql命令行编辑 - 码农甲乙丙 - CSDN博客 ...

  6. 文件传输协议FTP、SFTP和SCP

    网络通信协议分层 应用层: HTTP(Hypertext Transfer Protocol 超文本传输协议,显示网页) DNS(Domain Name System) FTP(File Transf ...

  7. # 【Python3练习题 004】输入某年某月某日,判断这一天是这一年的第几天?

    # [Python练习题 004]输入某年某月某日,判断这一天是这一年的第几天? # 思路:先判断是否为闰年,这关系到 2 月份的天数.# 之后再根据月份值把前几个月的天数累积加起来,最后再加上个“日 ...

  8. h5小功能_classList和自定义属性data

    ###1.classList返回一个对象集 通过obj.classList.add()或obj.classList.remove()可操作对象的class属性值 classList.toggle( ) ...

  9. C#复习笔记(4)--C#3:革新写代码的方式(扩展方法)

    扩展方法 扩展方法有以下几个需求: 你想为一个类型添加一些 成员: 你不需要为类型的实例添加任何更多的数据: 你不能改变类型本身, 因为是别人的代码. 对于C#1和C#2中的静态方法,扩展方法是一种更 ...

  10. Python 基础之----网络编程

    阅读目录 一 客户端/服务端架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 ...