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. AtCoder Beginner Contest 053

    D - Card Eater Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Statement Snuke h ...

  2. 《梦断代码》Scott Rosenberg著(三)

    开放与封闭之论: 程序源代码是商业软件公司最重要的资产,所以软件公司售卖二进制文件.这样也就意味着如果微软的软件产品出了问题,即便你是一个程序大牛也无法修复它.你只能等着微软来修正问题,因为只有微软程 ...

  3. Python_列表初识及操作

    列表 列表初识 列表属于容器性数据类型. li = [123, '狗', True, [1, 2, 3], {'name': 'Lon'}, (1, 2, 3)] 其中包含有int型,例如123:字符 ...

  4. JEECG 单点登录 SSO

    jeecg中用户登录的唯一性-CSDN问答https://ask.csdn.net/questions/656639 JEECG 集成KiSSO单点登录实现统一身份认证 - zhangdaiscott ...

  5. 1244. Minimum Genetic Mutation

    描述 A gene string can be represented by an 8-character long string, with choices from "A", ...

  6. Oracle创建表空间、用户以及给用户赋权

    --创建表空间 create tablespace waterboss datafile 'd:\waterboss.dbf' size 100m autoextend on next 10m --创 ...

  7. JUnit测试提示Java.lang.Exception: No runnable methods

    网上一大堆都说,没写@Test,或者是,导包错误,= =然而我并没有发现我有这个毛病 = =最后终于找到罪魁祸首 Junit版本太低!!! Junit版本太低!!! Junit版本太低!!! = =因 ...

  8. Flutter的scope_model使用mixin语法报错

    在pubspec.yaml同级目录下创建analysis_options.yaml文件,内容: # https://www.dartlang.org/guides/language/analysis- ...

  9. java中解决小数精度问题

    public class TestDouble { public static void main(String[] args) { Double d1 = 0.1; Double d2 = 0.2; ...

  10. DAY09、函数

    一.函数的定义:跟变量名的定义大同小异 1.声明函数的关键词:def 2.函数(变量)名:使用函数的依据 3.参数列表:()   参数个数可以为0到n个,但()一定不能丢,完成功能的必要条件 4.函数 ...