上一版貌似是打了 O(3 ^ N) 暴力和 一条链的情况,得了60分。。。。

第一次做的时候光想练一练暴力。。。就没去想正解,谁知道正解比暴力好写不知道多少,mmp

设 f(S) 为 选集合S中的点可以得最大独立集的概率, M(S) 为 集合S 中的点构成的最大独立集是多少。

那么我们转移的时候,就枚举一下集合S中第一个加入独立集的点i,删去集合中和i相邻的点(包括i),得到s',用它更新M()之后,f()就可以顺带算出来了。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int ha=998244353,maxn=2333333;
inline void add(int &x,int y){ x+=y; if(x>=ha) x-=ha;}
int p[29],n,m,ci[33],f[maxn],M[maxn],inv[33],all;
int main(){
ci[0]=inv[1]=1,ci[1]=2;
for(int i=2;i<=30;i++) ci[i]=ci[i-1]<<1,inv[i]=ha-inv[ha%i]*(ll)(ha/i)%ha; scanf("%d%d",&n,&m),all=ci[n]-1;
int uu,vv;
while(m--) scanf("%d%d",&uu,&vv),uu--,vv--,p[uu]|=ci[vv],p[vv]|=ci[uu];
for(int i=0;i<n;i++) p[i]|=ci[i]; f[0]=1,M[0]=0;
for(int i=1,now;i<=all;i++){
now=0; for(int j=0,lef;j<n;j++) if(ci[j]&i){
lef=(all^p[j])&i,now++;
if(M[lef]>=M[i]) M[i]=M[lef]+1,f[i]=f[lef];
else if(M[lef]+1==M[i]) add(f[i],f[lef]);
} f[i]=f[i]*(ll)inv[now]%ha;
} printf("%d\n",f[all]);
return 0;
}

  

最新文章

  1. Wizard Framework:一个自己开发的基于Windows Forms的向导开发框架
  2. mysql存储过程 --游标的使用 取每行记录 (多字段)
  3. android studio logcat 换行(日志换行)
  4. [Android]ViewPager如何只初始化一个页面
  5. 通信录分组并且分组标签悬停划入划出(包含错误信息及修改)--第三方开源--PinnedSectionListView
  6. find和findstr
  7. hdu 2438
  8. linux chmod使用说明
  9. LibSVM笔记系列(3)——初学移植libsvm的C/C++版本
  10. 重拾C
  11. (简单) CF 44D Hyperdrive,数学。
  12. 使用proxool连接池配置教程
  13. 实现点击后创建div,若对div2秒无操作则将div隐藏,鼠标移上div让它不隐藏,移出div超过两秒则div隐藏
  14. 深度剖析Redis持久化
  15. cocos2d-x中处理touch事件
  16. 解决os x下gdb不能调试的问题
  17. 2018-2019-1 20189201 《LInux内核原理与分析》第七周作业
  18. A1074. Reversing Linked List
  19. JAVA JComboBox的监听事件(ActionListener、ItemListener)
  20. kbmMW CopyRawRecords 用法

热门文章

  1. webpack 引入 html-webpack-plugin 报错
  2. background-color和background-image问题
  3. import as from import 区别
  4. Python小程序之sed命令替换
  5. MYSQL5.7修改密码
  6. [Leetcode Week10]01 Matrix
  7. Linux内核同步机制之(四):spin lock【转】
  8. [ python3 ] 基于zabbix 自动抓取每天监控数据
  9. 【 Tomcat 】tomcat8.0 基本参数调优配置
  10. cpu中的缓存和操作系统中的缓存分别是什么?