P6846-[CEOI2019]Amusement Park【状压dp,FWT】
正题
题目链接: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−TGT
然后化成集合幂级数的形式就是
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∑na[xi]a−1[xn−i]=0⇒a−1[xn]=a[x0]∑i=0n−1a−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】相关推荐
- 【UOJ348】【WC2018】州区划分 状压DP FWT
题目大意 给定一个\(n\)个点的无向图,对于每种 \(n\) 个点的划分\(\{S_1,S_2,\ldots,S_k\}\),定义它是合法的,当且仅当每个点都在其中的一个集合中且对于任何的\(i\i ...
- bzoj2560 串珠子 状压dp+FWT
Description 铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体. 现在已知所有珠子互不相同,用整数1到n编号.对于第i个珠子和第j个珠子,可以选择不 ...
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
\(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...
- codeforces 8C. Looking for Order 状压dp
题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...
- UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)
整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...
- POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)
poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...
- 【每日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 ...
- hdu 4778 Gems Fight! 状压dp
转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...
- 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)
题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...
最新文章
- Lumen框架多数据库连接配置方法
- ROS、realsense开发常用命令汇总
- Ubuntu 安装 opencv-nonfree
- 模板元编程实现素数判定
- Multi-thread--提高C++性能的编程技术笔记:多线程内存池+测试代码
- Android 驱动(15)---如何修改USB驱动能力
- openssl内存分配,查看内存泄露
- 接口与抽象类的区别和相同点
- 心理测评软件php mysql_中小学版心理测评档案管理系统
- 有一种爱情,叫沉、重!
- codeblocks17.12安装及汉化
- PbootCMS百度小程序插件 DIY拖拽可视化布局 多端合一 一步到位
- 解决Chrome 的右键谷歌网页翻译失效 20221107更新
- 百度2017春招-买帽子
- 为什么公司要用企业邮箱
- 逆水寒2021最新服务器,逆水寒公布2021部分更新计划,写满了离经叛道
- php 获取hashcode,产生runnable
- 获得当前年月日时分秒并能判断是早晨 中午 下午 深夜
- Launcher启动流程及初始化
- 构建云管理平台,需要满足哪几方面需求?
热门文章
- mysql 免费前端_MySQL
- linux查看mq是否启动的命令,rocketmq查看命令
- 后端返回number类型数据_Javascript基础教程之数据类型 (数值 Number)
- linux gcc出错,编译arm-linux-gcc出错
- 软件构造学习笔记-第八周
- com.mysql.cj.exceptions.InvalidConnectionAttributeException
- mysql 5.5 免安装_mysql 5.5.56免安装版配置方法
- [JavaWeb-HTML]HTML标签_列表标签
- linux关机方法有哪些?有何区别_Linux下判断是否正常关机的一个简单方法
- 多项式求逆模板(NTT + mod)