51nod 1518 稳定多米诺覆盖(容斥+二项式反演+状压dp)
[传送门[(http://www.51nod.com/Challenge/Problem.html#!#problemId=1518)
解题思路
直接算不好算,考虑容斥,但并不能把行和列一起加进去容斥,这会使时间复杂度非常高,那么就考虑枚举行后\(dp\)。设\(f[i]\)表示存在\(i\)列有线,任意一行无线的方案数,\(g[i[\)表示至少有\(i\)列有线,任意一行无线的方案数,那么
\]
二项式反演得
\]
那么只需要考虑求出\(g\)。
首先要预处理出来\(dp[i][j]\)表示\(i\)行\(j\)列任意放的方案数,那么算答案时可以先枚举哪几列有线,然后算出\(g[i]\),\(g[i]\)就是首先把\(dp\)数组合并,直观理解就是把那几块拼在一起,然后减去\(j<i\)的\(g[j]\),就是保证行没有线,之后就可以算答案了。时间复杂度O(\(2^n n^2)\)
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#define int long long
using namespace std;
const int N=18;
const int MOD=1e9+7;
typedef long long LL;
int f[N][N],n,m,g[N],ans,dp[2][(1<<(17))],tmp[N];
vector<int> v;
inline void DP(int lim){
memset(dp,0,sizeof(dp));
int now=0; dp[0][(1<<lim)-1]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=lim;j++){
now^=1; memset(dp[now],0,sizeof(dp[now]));
for(int S=0;S<(1<<lim);S++)if(dp[now^1][S]){
if(S&1) (dp[now][S>>1]+=dp[now^1][S])%=MOD;
if(i!=1 && (!(S&1)))
(dp[now][(S>>1)|(1<<(lim-1))]+=dp[now^1][S])%=MOD;
if(j!=1 && (S&1) && lim>1 && (!(S&(1<<(lim-1)))))
(dp[now][(S>>1)|(1<<(lim-1))|(1<<(lim-2))]+=dp[now^1][S])%=MOD;
}
}
f[i][lim]=dp[now][(1<<lim)-1];
}
}
inline void prework(){
for(int i=1;i<=m;i++) DP(i);
}
signed main(){
n=m=16; prework();
while(~scanf("%lld%lld",&n,&m)){
for(int S=(1<<(m-1));S<(1<<m);S++){
int lst=0; v.clear();
for(int i=1;i<=m;i++)
if(S&(1<<(i-1))) v.push_back(i-lst),lst=i;
for(int i=1;i<=n;i++){
tmp[i]=1;
for(int j=0;j<v.size();j++)
tmp[i]=1ll*tmp[i]*f[i][v[j]]%MOD;
}
for(int i=1;i<=n;i++){
g[i]=tmp[i];
for(int k=1;k<i;k++)
g[i]-=1ll*g[k]*tmp[i-k]%MOD,g[i]%=MOD;
}
if(v.size()&1) (ans+=g[n])%=MOD;
else (ans-=g[n])%=MOD;
} ans=(ans%MOD+MOD)%MOD;
printf("%lld\n",ans); ans=0;
}
return 0;
}
51nod 1518 稳定多米诺覆盖(容斥+二项式反演+状压dp)的更多相关文章
- 【做题】51NOD1518 稳定多米诺覆盖——容斥&dp
题意:求有多少种方案,用多米诺骨牌覆盖一个\(n\times m\)的棋盘,满足任意一对相邻行和列都至少有一个骨牌横跨.对\(10^9+7\)取模. \(n,m \leq 16\) 首先,这个问题的约 ...
- Luogu P2595 [ZJOI2009]多米诺骨牌 容斥,枚举,插头dp,轮廓线dp
真的是个好(毒)题(瘤).其中枚举的思想尤其值得借鉴. \(40pts\):插头\(dp\),记录插头的同时记录每一列的连接状况,复杂度\(O(N*M*2^{n + m} )\). \(100pts\ ...
- 【题解】[HAOI2018]染色(NTT+容斥/二项式反演)
[题解][HAOI2018]染色(NTT+容斥/二项式反演) 可以直接写出式子: \[ f(x)={m \choose x}n!{(\dfrac 1 {(Sx)!})}^x(m-x)^{n-Sx}\d ...
- 51Nod1518 稳定多米诺覆盖 动态规划 插头dp 容斥原理
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1518.html 题目传送门 - 51Nod1518 题意 51Nod真是个好OJ ,题意概括的真好, ...
- NOI Online 游戏 树形dp 广义容斥/二项式反演
LINK:游戏 还是过于弱鸡 没看出来是个二项式反演,虽然学过一遍 但印象不深刻. 二项式反演:有两种形式 一种是以恰好和至多的转换 一种是恰好和至少得转换. 设\(f_i\)表示至多的方案数 \(g ...
- 多米诺骨牌放置问题(状压DP)
例题: 最近小A遇到了一个很有趣的问题: 现在有一个\(n\times m\)规格的桌面,我们希望用\(1 \times 2\)规格的多米诺骨牌将其覆盖. 例如,对于一个\(10 \times 11\ ...
- HDU5731 Solid Dominoes Tilings 状压dp+状压容斥
题意:给定n,m的矩阵,就是求稳定的骨牌完美覆盖,也就是相邻的两行或者两列都至少有一个骨牌 分析:第一步: 如果是单单求骨牌完美覆盖,请先去学基础的插头dp(其实也是基础的状压dp)骨牌覆盖 hiho ...
- bzoj2669[cqoi2012]局部极小值 容斥+状压dp
2669: [cqoi2012]局部极小值 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 774 Solved: 411[Submit][Status ...
- 51nod 1673 树有几多愁——虚树+状压DP
题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1673 建一个虚树. 一种贪心的想法是把较小的值填到叶子上,这样一个小值限制到的 ...
随机推荐
- 用 Flask 来写个轻博客 (37) — 在 Github 上为第一阶段的版本打 Tag
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 第一阶段结语 打 Tag 前文列表 用 Flask 来写个轻博客 (1 ...
- C#通过UserAgent判断智能设备(Android,IOS,PC,Mac)
尝试通过 Agent 来获取相应的智能手机设备标识,根据标识的不同来输出对应设备所需的显示样式及其他.经过努力,终于搜集了比较全的 智能设备 的 Agent,相应的判断过程及代码如下,不明白的留言. ...
- oracle三大范式
范式: 设计数据库定义的一个规则, 三大范式, 灵活运用, 人的思想是活的 一范式 1, 不存在冗余数据 同一个表中的记录不能有重复----所以主键(必须有) 2, 每个字段必须是不可再分的信息(列不 ...
- python3标准库总结
Python3标准库 操作系统接口 os模块提供了不少与操作系统相关联的函数. ? 1 2 3 4 5 6 >>> import os >>> os.getcwd( ...
- HDFS-NameNode和SeconddaryNode
一.NN和2N的工作机制 一.概述 一.概述 一.概述 一.概述 一.概述 一.概述 一.概述
- Codeforces 1082G(最大权闭合子图)
题面 传送门 分析 没想到压轴题是道模板裸题 由于子图的权值=边权和-点权和 将边和点都看成新图中的点 S向原来的边i连边,权值为边权 点i向T连边,权值为点权 边i:(u,v,w)向u,v,连边,权 ...
- 【题解】Hankson 的趣味题
题目大意 已知正整数$a_{0}$.$a_{1}$.$b_{0}$.$b_{1}$($1 \leq a_{0}, a_{1}, b_{0}, b_{1} \leq 2 \times 10^{9}$), ...
- 1481:Maximum sum (前缀和+dp)
[题目描述] 对一个序列A={a1, a2,..., an}给出函数: t1 t2 d(A) = max{ ∑ai + ∑aj | 1 <= s1 <= t1 < s2 <= ...
- NGUI动态字体的创建(font maker)
1,打开font maker 2,在font maker中创建选择动态字体 PS: 1,动态字体相对静态字体来说,动态字体比较消耗性能 2,静态字体是创建在图集中,这也是没那么消耗性能的原因
- JavaScript中的方法和属性
书读百遍其义自见 学习<JavaScript设计模式>一书时,前两个章节中的讲解的JavaScript基础知识,让我对属性和方法有了清晰的认识.如下是我的心得体会以及部分摘录的代码. 不同 ...