当前位置: 首页 > news >正文

题解:P12232 【模板】集合幂级数求逆

其实是半在线子集卷积模板。

算法简介

半在线子集卷积用来处理形如 \(f_S=\sum\limits_{T\subseteq S}f_Tg_{S-T}\) 的卷积。

与子集卷积相同地,我们设 \(F_{i,S}=[|S|=i]f_S,G_{i,S}=[|S|=i]g_S\),然后按照 \(i\) 从小到大得到 \(f\) 的值。现在,假设 \(|S|<i\) 的所有 \(f_S\) 已被求出,考虑如何求一个 \(|S|=i\)\(f_S\)。如果暴力地做,直接枚举子集转移,复杂度 \(O(3^n)\),不能接受。我们对 \(j<i\) 的所有 \(F_{j},G_{j}\) 做高维前缀和,得到 \(\text{FWT}(F)_{i},\text{FWT}(G)_{i}\),然后就会发现 \(\text{FWT}(F)_{i,S}=\sum\limits_{T\subseteq S}[|T|=i]sum_{i,T}\),对于 \(\text{FWT}(G)\) 同理。于是 \(\text{FWT}(F)_{i,S}=\sum\limits_{j\le i}\text{FWT}(F)_{i-j,S}\text{FWT}(G)_{j,S}\),就可以 \(O(n)\) 转移了。

复杂度分析

对于每个 \(i,S\)\(F_{i,S}\) 需要 \(O(n)\) 时间得到,需要 \(O(n)\) 次 FWT,总复杂度 \(O(2^nn^2)\)居然和普通子集卷积的复杂度一样!

思路

直接看题目给的式子 \(F(x)G(x)=1\)。设 \(f_S=[x^S]F(x),g_S=[x^S]G(x)\),则有

\[\sum\limits_{T\subseteq S}f_Tg_{S-T}=[S\not=\varnothing] \]

\(S=\varnothing\),可得 \(g_\varnothing f_\varnothing=1\)

现在设 \(S\not=\varnothing\),则:

\[\begin{aligned} &\sum\limits_{T\subseteq S}f_Tg_{S-T}=\sum\limits_{T\subseteq S,T\not=\varnothing}f_Tg_{S-T}+f_\varnothing g_S=0\\ &g_S=-\frac{1}{f_\varnothing}\sum\limits_{T\subseteq S,T\not=\varnothing}f_Tg_{S-T} \end{aligned} \]

然后就是一个半在线子集卷积。

代码

#include <bits/stdc++.h>
using namespace std;
constexpr int N=20,mod=998244353;
int n,f[N+1][1<<N],g[N+1][1<<N];
long long qpow(long long x,int y=mod-2){long long ans=1;for(;y;y>>=1,x=x*x%mod)if(y&1)ans=ans*x%mod;return ans;
}
void FWT(int *f,int n,int rev=0){for(int w=1;w<n;w<<=1)for(int i=0;i<n;i+=w<<1)for(int j=0;j<w;j++)if(rev)f[i+j+w]-=f[i+j],f[i+j+w]<0&&(f[i+j+w]+=mod);else f[i+j+w]+=f[i+j],f[i+j+w]>=mod&&(f[i+j+w]-=mod);
}
signed main(){clock_t _st=clock();ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n;for(int i=0;i<1<<n;i++)cin>>f[__builtin_popcount(i)][i];g[0][0]=qpow(f[0][0]);FWT(g[0],1<<n),FWT(f[0],1<<n);for(int i=1,inv=mod-g[0][0];i<=n;i++){FWT(f[i],1<<n);for(int j=1;j<=i;j++)for(int s=0;s<1<<n;s++)g[i][s]=(g[i][s]+1ll*g[i-j][s]*f[j][s])%mod;FWT(g[i],1<<n,1);for(int s=0;s<1<<n;s++)g[i][s]=1ll*g[i][s]*inv%mod;FWT(g[i],1<<n);}for(int i=0;i<=n;i++)FWT(g[i],1<<n,1);for(int i=0;i<1<<n;i++)cout<<g[__builtin_popcount(i)][i]<<' ';cout<<'\n';clock_t _ed=clock();cerr<<(_ed-_st)*1.0/CLOCKS_PER_SEC<<'\n';return 0;
}
http://www.jsqmd.com/news/420705/

相关文章:

  • AI 自动编程:一句话设计高颜值博客
  • 2025激光切割机十大品牌榜单出炉 国产力量与国际巨头共绘行业新图景 - 资讯焦点
  • 多维透视:中国知名科技公司的崛起与格局——以技术创新驱动的产业变革 - 资讯焦点
  • 国产激光装备竞争加剧 宏山激光与森峰哪个质量更好?多点对比见真章 - 资讯焦点
  • 2.28
  • INFINITI数码UV冷烫一体机常见问题解答(2026专家版) - 速递信息
  • 自制图片批量重命名工具,解决HR朋友的批量文件处理刚需
  • 国企OA系统如何用WebUploader+PHP优化超大附件的分片传输效率?
  • 2026年上海售后完善的公司注册平台盘点,靠谱之选不容错过 - 工业设备
  • 2026国内专业调度台品牌热榜,推荐款在这儿,防雨板/开关防雨箱/方舟控制台/可移动式监控杆,调度台供应厂家排行榜 - 品牌推荐师
  • 为什么制造业巨头都认可苏州西恩士工业的定制化方案? - 工业干货社
  • 跨平台富文本工具怎样实现Word样式无损导入?
  • 图床测试
  • 军工OA系统富文本编辑器支持Word样式粘贴吗?
  • 基于模糊PID的卤煮设备温度控制系统设计与仿真
  • 分析选择塑料制品加工厂的要点,靠谱的厂家有哪些? - 工业推荐榜
  • 复现论文《基于改进合作搜索算法的模块化温差阵列重构研究》
  • 可靠的UI设计培训班有哪些品牌,像素壹佰好吗 - mypinpai
  • 央企项目如何通过WebUploader+PHP实现文件夹目录结构的断点续传?
  • 信创环境下,WebUploader如何结合PHP保障分片上传的国产化安全?
  • 计算机毕业设计springboot医院预约挂号系统 基于SpringBoot的智慧医疗门诊预约服务平台 SpringBoot框架下的在线医疗挂号与就诊管理系统
  • ViDoRAG:视觉丰富文档的检索增强生成新范式,多智能体+动态检索解锁复杂推理
  • 高清原图已失效?可能是你没找对它的“缓存遗体”
  • Splunk internal 500 报错解决
  • 信创环境下Word文档上传后格式错乱如何处理?
  • 国防军工领域如何用WebUploader+PHP加密传输分片上传的敏感文件?
  • 利用MATLAB从三维图形到二维图形的简化探索
  • Windows 宝塔面板 Nginx + Python 部署踩坑记:解决配置失效、502 及多项目共存
  • keil创建多目标工程
  • 2026年大阪侨领房产情况分析,日本房产领域专业服务推荐 - 工业设备