先求出不考虑分割线的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. bzoj1529 [POI2005]ska Piggy banks 并查集

    [POI2005]ska Piggy banks Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1508  Solved: 763[Submit][Sta ...

  2. bzoj 1106 [POI2007]立方体大作战tet 树状数组优化

    [POI2007]立方体大作战tet Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 821  Solved: 601[Submit][Status][ ...

  3. SDUT3926 kmp

    bLue的二叉树 Time Limit: 3000MS Memory Limit: 65536KB Submit Statistic Problem Description Keke 是一个喜爱种树的 ...

  4. HDU3376 最小费用最大流 模板2

    Matrix Again Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)To ...

  5. ios开关按钮

    .al-toggle-button{ appearance: none; -webkit-appearance: none; position: relative; width: 52px; heig ...

  6. Hbase万亿级存储性能优化总结

    背景 hbase主集群在生产环境已稳定运行有1年半时间,最大的单表region数已达7200多个,每天新增入库量就有百亿条,对hbase的认识经历了懵懂到熟的过程.为了应对业务数据的压力,hbase入 ...

  7. 2017 济南综合班 Day 5

    毕业考试 (exam.cpp/c/pas) (1s/256M) 问题描述 快毕业了,Barry希望能通过期末的N门考试来顺利毕业.如果他的N门考试平均分能够达到V分,则他能够成功毕业.现在已知每门的分 ...

  8. hdu 4903 The only survival

    The only survival http://acm.hdu.edu.cn/showproblem.php?pid=4903 Time Limit: 40000/20000 MS (Java/Ot ...

  9. LightOJ 1340 - Story of Tomisu Ghost 阶乘分解素因子

    http://www.lightoj.com/volume_showproblem.php?problem=1340 题意:问n!在b进制下至少有t个后缀零,求最大的b. 思路:很容易想到一个数通过分 ...

  10. Epoll模型讲解

    1.流模型 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. 不管是文件,还是套接字,还是管道,我们都可以把他们看作流. 之后我们来讨论I/O的操作, ...