先求出不考虑分割线的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. 在CentOS6.5 下安装并使用Java开发opencv的配置(一)

    1) 安装gcc以及cmake等等乱七八糟的软件 yum install gcc yum install python yum install cmake yum groupinstall " ...

  2. std::string::find() 和 std::string::npos

    npos是一个常数,用来表示不存在的位置,string::npos代表字符串到头了结束了.   int idx = str.find("abc");if (idx == strin ...

  3. BZOJ1880: [Sdoi2009]Elaxia的路线(最短路)

    1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2049  Solved: 805 题目链接:https ...

  4. Moodle插件开发——Blocks(版块)

    前提: 1)     基于Moodle3.0,要求Moodle版本高于2.0 2)     PHP编程基础:语言的了解和开发工具使用 有经验的开发人员和那些只是想程序员的参考文本应参阅附录A. 1.  ...

  5. ubuntu 14.04 安装win7虚拟机

    主机OS:ubuntu 14.04 virtual box:http://download.virtualbox.org/virtualbox/5.1.28/virtualbox-5.1_5.1.28 ...

  6. java中String字符串的替换函数:replace与replaceAll的区别

    例如有如下x的字符串 String x = "[kllkklk\\kk\\kllkk]";要将里面的“kk”替换为++,可以使用两种方法得到相同的结果 replace(CharSe ...

  7. java加载驱动

    加载驱动方法 1.Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 2. DriverManager.r ...

  8. UVA 1210 Sum of Consecutive Prime Numbers

    https://vjudge.net/problem/UVA-1210 统计质数前缀和,枚举左右端点,这一段的区间和+1 #include<cstdio> #define N 10001 ...

  9. java 8新特性 instant

    Java 8目前已经开始进入大众的视线,其中笔者在写本文之前,留意到其中Java 8预览版中将会出现新的关于日期和时间的API(遵守JSR310规范).在本系列文章中,将对这些新的API进行举例说明. ...

  10. 「6月雅礼集训 2017 Day7」电报

    [题目大意] 有n个岛屿,第i个岛屿有有向发射站到第$p_i$个岛屿,改变到任意其他岛屿需要花费$c_i$的代价,求使得所有岛屿直接或间接联通的最小代价. $1 \leq n \leq 10^5, 1 ...