正题

题目链接:https://www.luogu.com.cn/problem/P6846


题目大意

给出nnn个点mmm条边的一张有向图,保证两个点之间最多只有一条边。现在你可以取反一些边使得图变为一张DAGDAGDAG,求所有方案的取反的边数和。

1≤n≤181\leq n\leq 181≤n≤18


解题思路

考虑到对于一种方案取反所有边就是另一种方案,所以每种方案的取反边数的平均值肯定是m2\frac{m}{2}2m​,所以我们只需要统计方案数就好了。

然后再考虑dpdpdp,朴素的做法是O(3n)O(3^n)O(3n)的,记GSG_SGS​表示集合SSS是否是独立集那么有
FS=∑T⊆S(−1)∣T∣+1FS−TGTF_S=\sum_{T\sube S}(-1)^{|T|+1}F_{S-T}G_TFS​=T⊆S∑​(−1)∣T∣+1FS−T​GT​
然后化成集合幂级数的形式就是
F=FG+1⇒F=11−GF=FG+1\Rightarrow F=\frac{1}{1-G}F=FG+1⇒F=1−G1​

至于集合幂级数怎么求逆,定义占位多项式
GS,i′=∑S=0n[count(S)=i]GSG'_{S,i}=\sum_{S=0}^n[count(S)=i]G_SGS,i′​=S=0∑n​[count(S)=i]GS​
然后对于每个GSG_SGS​视为一个多项式求逆。

然后求逆可以用O(n2)O(n^2)O(n2)的反正nnn很小。

对于aaa求逆,首先有a−1[x0]=1a[x0]a^{-1}[x_0]=\frac{1}{a[x_0]}a−1[x0​]=a[x0​]1​,然后有
∑i=0na[xi]a−1[xn−i]=0⇒a−1[xn]=∑i=0n−1a−1[xi]a[xn−i]a[x0]\sum_{i=0}^na[x^i]a^{-1}[x^{n-i}]=0\Rightarrow a^{-1}[x^n]=\frac{\sum_{i=0}^{n-1}a^{-1}[x^i]a[x^{n-i}]}{a[x^0]}i=0∑n​a[xi]a−1[xn−i]=0⇒a−1[xn]=a[x0]∑i=0n−1​a−1[xi]a[xn−i]​

这样就可以O(n2)O(n^2)O(n2)递推了。

时间复杂度:O(2nn2)O(2^nn^2)O(2nn2)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=18,P=998244353;
ll n,m,MS,c[1<<N],g[1<<N],F[N+1][1<<N],G[N+1],H[1<<N];
void FWT(ll *f,ll op){for(ll p=2;p<=MS;p<<=1)for(ll k=0,len=p>>1;k<MS;k+=p)for(ll i=k;i<k+len;i++)(f[i+len]+=f[i]*op+P)%=P;return;
}
signed main()
{scanf("%lld%lld",&n,&m);for(ll i=1,x,y;i<=m;i++){scanf("%lld%lld",&x,&y);x--;y--;g[(1<<x)|(1<<y)]=1;}MS=(1<<n);for(ll i=0;i<n;i++)for(ll s=0;s<MS;s++)if(!((s>>i)&1))g[s^(1<<i)]|=g[s];for(ll i=1;i<MS;i++){c[i]=c[i-(i&-i)]+1;if(!g[i])F[c[i]][i]=(c[i]&1)?1:(P-1);}F[0][0]=1;for(ll i=0;i<=n;i++)FWT(F[i],1);for(ll s=0;s<MS;s++){for(ll i=0;i<=n;i++)F[i][s]=P-F[i][s];G[0]=1;for(ll i=1;i<=n;i++){G[i]=0;for(ll j=1;j<=i;j++)(G[i]+=P-G[i-j]*F[j][s]%P)%=P;}H[s]=G[n];
//      printf("%lld ",G[n]);}FWT(H,-1);printf("%lld\n",(P+1)/2*H[MS-1]%P*m%P);return 0;
}

P6846-[CEOI2019]Amusement Park【状压dp,FWT】相关推荐

  1. 【UOJ348】【WC2018】州区划分 状压DP FWT

    题目大意 给定一个\(n\)个点的无向图,对于每种 \(n\) 个点的划分\(\{S_1,S_2,\ldots,S_k\}\),定义它是合法的,当且仅当每个点都在其中的一个集合中且对于任何的\(i\i ...

  2. bzoj2560 串珠子 状压dp+FWT

    Description 铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体. 现在已知所有珠子互不相同,用整数1到n编号.对于第i个珠子和第j个珠子,可以选择不 ...

  3. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  4. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  5. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

  6. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  7. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★

    昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...

  8. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  9. 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)

    题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...

最新文章

  1. Lumen框架多数据库连接配置方法
  2. ROS、realsense开发常用命令汇总
  3. Ubuntu 安装 opencv-nonfree
  4. 模板元编程实现素数判定
  5. Multi-thread--提高C++性能的编程技术笔记:多线程内存池+测试代码
  6. Android 驱动(15)---如何修改USB驱动能力
  7. openssl内存分配,查看内存泄露
  8. 接口与抽象类的区别和相同点
  9. 心理测评软件php mysql_中小学版心理测评档案管理系统
  10. 有一种爱情,叫沉、重!
  11. codeblocks17.12安装及汉化
  12. PbootCMS百度小程序插件 DIY拖拽可视化布局 多端合一 一步到位
  13. 解决Chrome 的右键谷歌网页翻译失效 20221107更新
  14. 百度2017春招-买帽子
  15. 为什么公司要用企业邮箱
  16. 逆水寒2021最新服务器,逆水寒公布2021部分更新计划,写满了离经叛道
  17. php 获取hashcode,产生runnable
  18. 获得当前年月日时分秒并能判断是早晨 中午 下午 深夜
  19. Launcher启动流程及初始化
  20. 构建云管理平台,需要满足哪几方面需求?

热门文章

  1. mysql 免费前端_MySQL
  2. linux查看mq是否启动的命令,rocketmq查看命令
  3. 后端返回number类型数据_Javascript基础教程之数据类型 (数值 Number)
  4. linux gcc出错,编译arm-linux-gcc出错
  5. 软件构造学习笔记-第八周
  6. com.mysql.cj.exceptions.InvalidConnectionAttributeException
  7. mysql 5.5 免安装_mysql 5.5.56免安装版配置方法
  8. [JavaWeb-HTML]HTML标签_列表标签
  9. linux关机方法有哪些?有何区别_Linux下判断是否正常关机的一个简单方法
  10. 多项式求逆模板(NTT + mod)