解析

又是一道我不会的容斥题
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. 【转】linux中waitpid及wait的用法
  2. JavaWeb总结(六)
  3. PyTorch基于Apex的混合精度加速
  4. C语言 字符串的读取
  5. oracle删除表空间中的表,ORACLE删除表空间中的所有表
  6. 创建一个圆类Circle的对象,分别设置圆的半径计算并分别显示圆半径、圆面积、圆周长。...
  7. 【译】权益证明的设计理念
  8. WinRAR 5.70 下载、安装和广告弹框去除
  9. IntelliJ IDEA使用教程(很全)
  10. vue 跳添加编辑页面传两个值_vue两个组件间值的传递或修改方式
  11. 不重复数字(洛谷 P4305)
  12. 机器学习中遇到的问题
  13. Asp.Net的Forms验证,解决Cookie和Seesion失效时间。
  14. Python生成二维码-qrcode
  15. WeakHashMap回收时机结合JVM 虚拟机GC的一些理解
  16. 交换机设备登录账号权限1_交换机怎么设置 交换机配置方法【详解】
  17. MT4 CRM 源码
  18. FreeMarker FTL标签
  19. rtl8139 群晖_黑群辉里的虚拟机安装XP系统,没有网卡怎么传入文件?
  20. 分享两种证件照换背景方法,轻松把照片底色变白

热门文章

  1. 没错,纯SQL查询语句可以实现神经网络
  2. matlab损失函数出现nan,[译]在训练过程中loss出现NaN的原因以及可以采取的方法。...
  3. java.awt.headless_以编程方式设置java.awt.headless = true
  4. mysql binlog oplog_mongodb 学习之oplog
  5. 各高校寒假时间公布_高校放假哪家长?多所高校寒假时间公布!
  6. python离群点检测_如何从熊猫DataFrame中检测峰点(离群值)
  7. typora公式zuo对齐_Markdown编辑神器-Typora
  8. 后端学习 - JVM(上)内存与垃圾回收
  9. leetcode1005. K 次取反后最大化的数组和
  10. [SpringBoot2]@MatrixVariableUrlPathHelper