P6846-[CEOI2019]Amusement Park【状压dp,FWT】

1|0正题

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


1|1题目大意

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

1n18


1|2解题思路

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

然后再考虑dp,朴素的做法是O(3n)的,记GS表示集合S是否是独立集那么有

FS=TS(1)|T|+1FSTGT

然后化成集合幂级数的形式就是

F=FG+1F=11G

至于集合幂级数怎么求逆,定义占位多项式

GS,i=S=0n[count(S)=i]GS

然后对于每个GS视为一个多项式求逆。

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

对于a求逆,首先有a1[x0]=1a[x0],然后有

i=0na[xi]a1[xni]=0a1[xn]=i=0n1a1[xi]a[xni]a[x0]

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

时间复杂度:O(2nn2)


1|3code

#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; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15437650.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(58)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示