hdu5731
先求出不考虑分割线的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的更多相关文章
- HDU5731 Solid Dominoes Tilings 状压dp+状压容斥
题意:给定n,m的矩阵,就是求稳定的骨牌完美覆盖,也就是相邻的两行或者两列都至少有一个骨牌 分析:第一步: 如果是单单求骨牌完美覆盖,请先去学基础的插头dp(其实也是基础的状压dp)骨牌覆盖 hiho ...
随机推荐
- dubbox小demo
概述: 我们建立两个web项目,一个是service负责提供服务,另一个是web项目负责调用服务. 两个项目都是 maven Project 项目 生产者项目: 项目中主要就是: pom文件,引入相关 ...
- What is the bitmap index?
示例执行计划: postgres ; QUERY PLAN ---------------------------------------------------------------------- ...
- ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) A map B贪心 C思路前缀
A. A Serial Killer time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- # Codeforces Round #529(Div.3)个人题解
Codeforces Round #529(Div.3)个人题解 前言: 闲来无事补了前天的cf,想着最近刷题有点点怠惰,就直接一场cf一场cf的刷算了,以后的题解也都会以每场的形式写出来 A. Re ...
- expect使用小结
因为工作关系,需要经常从线上机器上拉取数据,于是想着能否写个脚本,自动完成这个任务呢? 我一般使用scp在机器间传输文件,然而每次scp都需要输入密码,自动化脚本怎么解决这个问题呢?于是expect这 ...
- CentOS 下安装 LEMP 服务(nginx、MariaDB/MySQL 和 php)
转载自:https://linux.cn/article-4314-1.html 编译自:http://xmodulo.com/install-lemp-stack-centos.html 作者: D ...
- Nginx安装(官网翻译)
转载自:https://www.nginx.com/resources/wiki/start/topics/tutorials/install/ 二进制版本预包装的Linux和BSD大多数Linux发 ...
- 阿里C++研发实习二面和三面面经
下午连着面了阿里爸爸的二面和三面,非常不明白别人的三面都是hr了,为什么我还是在技术面,难道面了个假阿里.不管怎么样,来篇面经攒攒人品. 二面 第一次遇到这么严肃的面试官,居然可以全程无表情的,面了这 ...
- Hibernate入门(3)- 持久对象的生命周期介绍
在hibernate中对象有三种状态:瞬时态(Transient). 持久态(Persistent).脱管态或游离态(Detached).处于持久态的对象也称为PO(Persistence Objec ...
- bzoj 2121 DP
首先如果我们能处理出来i,j段能不能消掉,这样就可以直接dp转移了,设w[i]为前i为最少剩下多少,那么w[i]=w[j-1] (flag[j][i]). 现在我们来求flag[i][j],首先我们可 ...