解析

又是一道我不会的容斥题
qwq
本题的一个关键性质:答案有解时,极小值不超过8个
所以可以对其进行状压

考虑从小到大填数
那么在极小值填完之前,它的八连通必然是不能填的

设计dpi,sdp_{i,s}dpi,s​表示从小到大填了i个数,已经填完的极小值状态为s的方案数
不难作出转移

但是这样会统计一些不合法的方案!
有的非极小值可能由于周围全是非极小值,又随便填,导致成为了极小值
所以要扣去所有非极小值成为极小值的方案

方法就是dfs枚举哪些非极小值成为极小值dp再按这些非极小值的个数的奇偶性进行容斥

代码

//暴力
#include<bits/stdc++.h>
using namespace std;
const int mod=12345678;
#define ll long long
#define il inline
il ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;
}
int n,m;
bool jd[20][20];
int a[20][20];
int dx[9]={0,0,-1,-1,-1,0,1,1,1},dy[9]={0,-1,-1,0,1,1,1,0,-1};
int ans;
inline bool exi(int x,int y){return x>=1&&x<=n&&y>=1&&y<=m;
}
int x[50],y[50],tot,mi[50];
bool vis[12][12];
int dp[35][1050];
int num[1050];
int calc(){tot=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(jd[i][j]){++tot;x[tot]=i;y[tot]=j;}}}for(int s=0;s<mi[tot];s++){memset(vis,0,sizeof(vis));num[s]=n*m;for(int i=1;i<=tot;i++){if(s&mi[i-1]) continue;int xx=x[i],yy=y[i];if(!vis[xx][yy]){vis[xx][yy]=1;num[s]--;}for(int k=1;k<=8;k++){int nx=xx+dx[k],ny=yy+dy[k];if(exi(nx,ny)&&vis[nx][ny]==0){vis[nx][ny]=1;num[s]--;}}}//printf("s=%d num=%d\n",s,num[s]);}memset(dp,0,sizeof(dp));dp[0][0]=1;for(int i=1;i<=n*m;i++){for(int s=0;s<mi[tot];s++){dp[i][s]+=1ll*dp[i-1][s]*max(num[s]-i+1,0)%mod;if(dp[i][s]>=mod) dp[i][s]-=mod;for(int k=1;k<=tot;k++){if((s&mi[k-1])==0) continue;dp[i][s]+=dp[i-1][s-mi[k-1]];if(dp[i][s]>=mod) dp[i][s]-=mod;}}}return dp[n*m][mi[tot]-1];
}
void dfs(int x,int y,int o){if(x>n){/*for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) printf("%d ",jd[i][j]);putchar('\n');}*/if(o&1){ans-=calc();if(ans<0) ans+=mod;}else{ans+=calc();if(ans>=mod) ans-=mod;}//printf("ans=%d\n\n",ans);return;}if(y>m){dfs(x+1,1,o);return;}dfs(x,y+1,o);if(!jd[x][y]){for(int i=1;i<=8;i++){int nx=x+dx[i],ny=y+dy[i];if(exi(nx,ny)&&jd[nx][ny]) return;}jd[x][y]=1;dfs(x,y+1,o+1);jd[x][y]=0;}
}
int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifmi[0]=1;for(int i=1;i<=28;i++) mi[i]=mi[i-1]<<1;n=read();m=read();char c;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf(" %c",&c);jd[i][j]=c=='X';}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(!jd[i][j]) continue;for(int k=1;k<=8;k++){int nx=i+dx[k],ny=j+dy[k];if(exi(nx,ny)&&jd[nx][ny]){printf("0");return 0;}}}}dfs(1,1,0);printf("%d\n",ans);
}
/**/

P3160:局部极小值(容斥、状压)相关推荐

  1. 『容斥·状压』CF449D Jzzhu and Numbers

    P r o b l e m \mathrm{Problem} Problem 给出一个长度为n的序列 a 1 , a 2 . . . a n a_1,a_2...a_n a1​,a2​...an​. ...

  2. [容斥 状压DP] HDU4997. Biconnected

    令 fSf_S 表示点集 SS 的答案,gSg_S 表示点集 SS 的连通图个数 那么 gSg_S 可以通过枚举与编号最小的点联通的点集求出来 fS=gS−∑T∈SgT×MT,S−Tf_S=g_S-\ ...

  3. [容斥 状压DP 树形DP] BZOJ 4455 [Zjoi2016]小星星 UOJ #185 【ZJOI2016】小星星

    杜老师说的哦 据说有人n*3^n卡过去 ? UOJ上需要卡常哦 #include<cstdio> #include<cstdlib> #include<algorithm ...

  4. [CQOI2012] 局部极小值(状压DP + 容斥 + 搜索)

    problem luogu-P3160 solution 这么小的数据范围,非暴力不状压.暴力 O(28!)O(28!)O(28!) 呵呵呵可以拉走了. 我们不妨从小到大填数字,这样如果局部极小值点还 ...

  5. Wannafly挑战赛19:C. 多彩的树(状压+容斥)

    链接:https://www.nowcoder.com/acm/contest/131/C 来源:牛客网 题目描述 有一棵树包含 N 个节点,节点编号从 1 到 N.节点总共有 K 种颜色,颜色编号从 ...

  6. BZOJ 2560: 串珠子 (状压DP+枚举子集补集+容斥)

    (Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Su ...

  7. 20200515省选模拟赛B、幻化成风(毒瘤容斥题+构造容斥系数+生成函数+hash状压DP+Trie树优化背包)

    题解 花了一上午+一中午终于把这道题A了 首先,我们要求的是bi互不相同的合法方案数 我们可以枚举一个a的集合S,来强制里面的b全部都相同,然后其它的随便放 由于这个题的n的约数非常多,我们可以把它质 ...

  8. 小奇遐想 树状数组实现+容斥思想

    问题 M: 小奇遐想 时间限制: 1 Sec  内存限制: 128 MB 提交: 165  解决: 21 [提交] [状态] [讨论版] [命题人:admin] 题目描述 撷来一缕清风飘渺 方知今日书 ...

  9. [SDOI2009]Bill的挑战——全网唯一 一篇容斥题解

    全网唯一一篇容斥题解 Description Solution 看到这个题,大部分人想的是状压dp 但是我是个蒟蒻没想到,就用容斥切掉了. 并且复杂度比一般状压低, (其实这个容斥的算法,提出来源于y ...

最新文章

  1. 相似度和相异度、常用距离度量、余弦相似度
  2. 2019优质公众号大盘点,果断收藏了慢慢看吧 ~
  3. 《MySQL——加锁规则(待补全,有些没看懂)》
  4. ZeroMQ接口函数之 :zmq_tcp – 使用TCP协议的ØMQ网络单播协议
  5. Altium AD20如何选择重叠在下方的元件?如何对元件快速选择、选择区域内部、选择矩形接触到的对象
  6. TCP/IP面试常考题目
  7. 开发ffmpeg/live555常见问题错误及解决方法
  8. ValidateAntiForgeryToken的用途,解释和示例
  9. 内推|网易高级数据分析师(地点:杭州)
  10. 均值滤波去除图像噪声的matlab程序
  11. 更改画面_看够联想姨妈红?阿虚教你更改ThinkPad 开机画面
  12. Pascal Sentences数据集预处理
  13. IE associate Fix
  14. 在线二进制取余计算机,二进制换算(进制转换计算器)
  15. Fiori 磁贴配置
  16. 阅读笔记-HTTP返回状态码
  17. python爬取微信运动_如何利用Python爬取微信运动中各个好友的运动信息
  18. 什么是公考、联考、国考、省考、选调生?
  19. Raft 算法 详细版介绍
  20. 埃夫特机器人回零偏差太大_埃夫特指令

热门文章

  1. typora插入代码设置_Typora基本功能介绍
  2. 中科大计算机是一流学科吗,安徽2017双一流学科排行榜:中国科技大学第一
  3. 百度网页移动端html,百度移动端开始用网站品牌名代替网址显示
  4. win7美化_Potplayer64位美化版,无棒子的tv推送
  5. mysql 默认事务隔离级别_MySQL 事务隔离级别详解
  6. [JavaWeb-MySQL]多表关系介绍
  7. 高等数学下-赵立军-北京大学出版社-题解-练习10.4
  8. GCD and LCM HDU - 4497(素数打表+唯一分解定理)求多少种情况
  9. windows 仍在设置此设备的类配置。 (代码 56)_谷歌发布Flutter Alpha:支持Windows
  10. word List39