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 ...
随机推荐
- 人工智能----TensorFlow开篇简介
Artificial Intelligence,也就是人工智能.TensorFlow是Google在2015年底开源的项目 TensorFlow的论文地址:http://download.tensor ...
- 浅谈移动端三大viewport
我们通常在写移动端页面时,往往都会在html页面中加入这样一段话 <meta name="viewport" content="width=device-width ...
- git设置不需要密码
https方式每次都要输入密码,按照如下设置即可输入一次就不用再手输入密码的困扰而且又享受https带来的极速 设置记住密码(默认15分钟): git config --global credenti ...
- 51Nod 1014 X^2 Mod P
注意潜在范围 x*x用long long #include <bits/stdc++.h> using namespace std; typedef long long LL; #defi ...
- Zyan 一个通信框架
原文地址 本文示例 Zyan是一个简单直观的分布式应用程序开发框架. 以下是Zyan项目的简要概述. 架构图: Zyan一般由客户端和服务端组成.服务端(以组件的形式)提供服务,客户端远程调用服务端的 ...
- 【BZOJ4880】排名的战争 [暴力]
排名的战争 Time Limit: 8 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 小Q是一名出色的质检员,他负责质检 ...
- bzoj 2957: 楼房重建 ——线段树
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- hdu 2157 How many ways?? ——矩阵十题第八题
Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, ...
- 【NOIP】提高组2015 斗地主
[题意]按照斗地主出牌规则,给定手牌求出完的最少步数. [算法]模拟+搜索 [题解] 可以发现除了顺子,其它的出牌规则都和点数无关,只与同点数的牌数有关. 所以可以先暴力枚举要出哪些顺子,然后每一个出 ...
- 关于cocos2d-x 中 CCEditBox 的输入位置和IOS虚拟键盘位置不重合的bug
这个文章的名字起的实在是有点长,主要是怕说不清楚. 在IOS上,输入时,我看到过的比较少,就两种,如附件两张图.一个是虚拟键盘的输入框完全是在CCEditBox上,另一张虚拟键盘的输入区域是紧挨着键盘 ...