先求出不考虑分割线的n*m棋盘的覆盖方案数记为f[n][m]

然后枚举列分割线的状态(状压),计算此时不存在行分割线的方案数

求出这个我们就可以用容斥原理算出答案了

怎么算在列分割线确定的情况下,不存在行分割线的方案数呢?

记s[i]=f[i][a1]*f[i][a2]*...表示在有i行不考虑行分割线且列分割线分成a1,a2...ak块的方案数

则到第i行不存在行分割线的方案数g[i]=s[i]-∑ g[j]*s[i-j] (1<=j<i)

相当于补集转化,求第一条行分割线为j时不合法的方案数……

一开始把答案都预处理出来即可

 #include<bits/stdc++.h>

 using namespace std;
const int mo=1e9+;
int n,m;
int ans[][],f[][],s[],g[],q[];
void inc(int &a,int b)
{
a+=b;
if (a>=mo) a-=mo;
}
struct node
{
int st[<<],f[<<],len;
void clr()
{
for (int i=; i<=len; i++) f[st[i]]=;
len=;
}
void push(int nw,int w)
{
if (f[nw]==) st[++len]=nw;
inc(f[nw],w);
}
} h[]; void get()
{
for (int m=; m<=; m++)
{
int p=; h[].clr(); h[].clr();
h[].push(,);
for (int i=; i<=; i++)
{
for (int j=; j<m; j++)
{
p^=; h[p].clr();
for (int k=; k<=h[p^].len; k++)
{
int st=h[p^].st[k];
int w=h[p^].f[st];
if (i==)
{
if (j&&!(st>>(j-)&)) h[p].push(st|(<<(j-))|(<<j),w);
h[p].push(st,w);
}
else if (st>>j&)
{
if (j&&!(st>>(j-)&)) h[p].push(st|(<<(j-)),w);
h[p].push(st^(<<j),w);
}
else h[p].push(st|(<<j),w);
}
}
f[i][m]=h[p].f[(<<m)-];
}
}
} void calc()
{
memset(ans,,sizeof(ans));
for (m=; m<=; m++)
{
for (int st=; st<<<(m-); st++)
{
int t=;
for (int k=; k<m-; k++)
if (st>>k&) q[++t]=k+;
q[t+]=m;
for (int i=; i<=; i++)
{
s[i]=;
for (int j=; j<=t+; j++)
s[i]=1ll*s[i]*f[i][q[j]-q[j-]]%mo;
}
for (int i=; i<=; i++)
{
g[i]=s[i];
for (int j=; j<i; j++)
inc(g[i],mo-1ll*s[i-j]*g[j]%mo);
if (t&) inc(ans[i][m],mo-g[i]);
else inc(ans[i][m],g[i]);
}
}
}
} int main()
{
get();
calc();
while (scanf("%d%d",&n,&m)!=EOF) printf("%d\n",ans[n][m]);
}

hdu5731的更多相关文章

  1. HDU5731 Solid Dominoes Tilings 状压dp+状压容斥

    题意:给定n,m的矩阵,就是求稳定的骨牌完美覆盖,也就是相邻的两行或者两列都至少有一个骨牌 分析:第一步: 如果是单单求骨牌完美覆盖,请先去学基础的插头dp(其实也是基础的状压dp)骨牌覆盖 hiho ...

随机推荐

  1. 题解【luoguP3644 [APIO2015]八邻旁之桥】

    题目链接 题解 家和公司在同侧 简单,直接预处理掉 若 \(k=1\) 取所有的居民的\(\frac{家坐标+公司坐标}{2}\)的所有坐标的正中间建一座桥,使所有居民到的距离最小. 实现方法:线段树 ...

  2. ASP.NET基础学习(暴力破解密码)

    首先写出一段登陆程序: //ashx端 <%@ WebHandler Language="C#" Class="AddCalation" %> us ...

  3. Codeforces 671B/Round #352(div.2) D.Robin Hood 二分

    D. Robin Hood We all know the impressive story of Robin Hood. Robin Hood uses his archery skills and ...

  4. 【BZOJ】1609: [Usaco2008 Feb]Eating Together麻烦的聚餐

    [算法]动态规划 [题解]DP有个特点(递推的特点),就是记录所有可能状态然后按顺序转移. 最优化问题中DP往往占据重要地位. f[i][j]表示前i头奶牛,第i头改为号码j的最小改动数字,这样每头奶 ...

  5. JS的prototype和__proto__

    一.prototype和__proto__的概念 prototype是函数的一个属性(每个函数都有一 个prototype属性),这个属性是一个指针,指向一个对象.它 是显示修改对象的原型的属性. _ ...

  6. react组件之间的几种通信情况

    组件之间的几种通信情况 父组件向子组件通信 子组件向父组件通信 跨级组件通信 没有嵌套关系组件之间的通信 1,父组件向子组件传递 React数据流动是单向的,父组件向子组件通信也是最常见的;父组件通过 ...

  7. peewee外键性能问题

    # 转载自:https://www.cnblogs.com/miaojiyao/articles/5217757.html 下面讨论一下用peewee的些许提高性能的方法. 避免N+1查询 N+1查询 ...

  8. 网络设备之pci_device_id

    标准PCI设备都有一个配置寄存器,用来存储各种参数: /* pci设备配置寄存器 */ struct pci_device_id { /* 厂商id,设备id */ __u32 vendor, dev ...

  9. centos_7.1.1503_src_5

    http://vault.centos.org/7.1.1503/os/Source/SPackages/ minicom-2.6.2-5.el7.src.rpm 05-Jul-2014 13:50 ...

  10. centos_7.1.1503_src_1

    http://vault.centos.org/7.1.1503/os/Source/SPackages/ 389-ds-base-1.3.3.1-13.el7.src.rpm 31-Mar-2015 ...