首页 > 其他分享 >日记 2024.4.7:子集卷积

日记 2024.4.7:子集卷积

时间:2024-04-07 22:16:10浏览次数:14  
标签:2024.4 卷积 sum 幂级数 FWT 子集 exp 集合

日记 2024.4.7:子集卷积

记号

\(F(x)=\sum_{S\subseteq [n]}f_Sx^{S}\) 是一个集合幂级数,其中 \([n]=\{1, 2, \cdots, n\}\),\(f_S\) 是一个数组,然后写成像生成函数(其实是“形式幂级数”)的形式,\(x^S\) 的这个指数是没意义的。

FWT / FMT

即两个集合幂级数的并、交、异或卷积运算。

https://www.cnblogs.com/caijianhong/p/template-fwt.html

子集卷积

感觉集合幂级数的乘法卷积会好一点?

给出 \(F(x)=\sum_{S\subseteq [n]}f_Sx^{S}\) 与 \(G(x)=\sum_{S\subseteq [n]}g_Sx^{S}\),想求的是 \(H(x)=\sum_{S\in[n]}\sum_{T\subseteq S}f_{T}g_{S\setminus T}x^S\)。就和 \(H(x)=\sum_{S\in[n]}\sum_{T\cup R = S, T\cap R = \varnothing}f_{T}g_{R}x^S\) 一个意思,都是要求卷起来的集合不交。

我们已经掌握的集合幂级数的并运算,是能求 \(\sum_{S\subseteq[n]}\sum_{T\cup R}f_{T}g_{R}\),可能 \(T, R\) 有交。但是我们考虑如果它们有交,那么 \(|T|+|R|>|T\cup R|\),我们发现只要控制好 \(|T|+|R|=|T\cup R|\) 就能使其无交。

引入新的 \(y\) 记号,将 \(F(x)\) 写为 \(\hat F(x, y) = \sum_{S\subseteq [n]}f_Sx^{S}y^{|S|}\)(也许可以叫作……集合占位幂级数)。然后考虑求 \(\hat F(x, y)\) 与 \(\hat G(x, y)\) 的,\(x\) 上做集合的并,\(y\) 上做整数加法,求卷积,得到 \(\hat H(x, y)=\sum_{S\subseteq [n]}\sum_{k=0}^n\hat h_{S, k}x^Sy^k\)。我们转回去,使得 \(h_S=[x^Sy^{|S|}]\hat H(x, y)\) 即可,其余的项都不要了。

实现时对 \(y\) 这一维暴力加法卷积,每次都是将 \(y^k\) 的系数,即一个集合幂级数,做并卷积。但是不需要每次都如此暴力,对于同一个 \(y\),我们只用做一次 FWT,然后过程中不断点乘、加法,最后统一 FWT 回去。这是基于 FWT 是一个线性的运算。

一共做了 \(O(n)\) 次 \(O(n2^n)\) 的 FWT,所以复杂度为 \(O(n^22^n)\)。

求导公式复习

后面要反复使用,默认所求导的元是 \(x\),即 \(F'(x)\) 这个记号说的是 \(\dfrac{\mathrm d}{\mathrm dx}F(x)\),这个非常重要

\[(x^n)'=nx^{n-1} \]

\[(F(x)\pm G(x))'=F'(x)+G'(x) \]

\[(F(x)G(x))'=F'(x)G(x)+F(x)G'(x) \]

\[\left(\frac{F(x)}{G(x)}\right)'=\frac{F'(x)G(x)-F(x)G'(x)}{G(x)^2} \]

\[(F(G(x)))'=F'(G(x))G'(x) \]

\[\exp' x=\exp x \]

\[\ln' x=\frac{1}{x}\implies (\ln(1+x))'=\ln'(1+x)=\frac{1}{1+x} \]

子集 exp

原理

\(\exp x=\sum_{i=0}x^i/(i!)\),这里 \(x\) 可以是任何东西,只要幂运算有定义,所以考虑扔个集合幂级数进去,定义乘法是子集卷积。

\(\exp F(x)=\sum_{i=0}(F(x))^i/(i!)\)?很深刻的东西。不过我们最好先声明一下 \([x^\varnothing]F(x)=0\),不然这个级数不收敛,有可能无意义。这样,我们规定一个全新的东西,我们算 \(\exp F(x)-1\) 这个东西,即 \(\sum_{i=1}(F(x))^i/(i!)\),这样避开收敛之类的讨论。

考虑怎么算,将 \(F(x)\) 改成 \(\hat F(x, y)\),然后求 \(\exp \hat F(x, y)\)。以 \(y\) 为主元(?),就是对 \(y\) 那一维算 \(\exp\),将集合幂级数当作 \(y\) 的系数,然后集合幂级数做并卷积。对 \(x\) 维做 \(O(n)\) 次 FWT 之后,\(x\) 这一维做的就是加法、点乘,每一个数字都没什么关系。所以不妨做完 FWT 之后回去枚举 \(S\),以 \(x\) 为主元,将 \(y\) 这一维拿出来,一共 \(O(n)\) 个数字,算 \(\exp\)。然后再将 \(\exp\) 算的东西按顺序塞回去,再 IFWT 还原。

现在我们只需要关心形式幂级数的 \(\exp\) 怎么算。原来的“形式”是一个 FWT 之后的数组,我们枚举每一位拆成 \(O(2^n)\) 次 \(\exp\),现在“形式”就是一些 modint 了。

计算

\(O(n\log n)\) 的 \(\exp\) 常数比较厉害。因为 \(n\) 太小了,考虑 \(O(n^2)\) 能否求 \(\exp\)?

设 \(G(x)=\exp F(x)-1\),注意 \(G(0)=0\)。然后两边求导:

\[G'(x)=F'(x)\exp F(x)=F'(x)(G(x) + 1) \]

有一个 \(G\) 的求导,提取 \([x^{n-1}]\) 系数:(因为非常自闭的 \(G(0)=0\) 所以不得不特判一下了)

\[ng_n=\sum_{i=0}^{n-1}(i+1)f_{i+1}g_{n-i-1}=\sum_{i=1}^nif_ig_{n-i}+nf_n \]

然后这是可以计算的。\(O(n^2)\) 递推每一项系数。

组合意义

想必是选出若干不相交集合组合成 \(S\) 的方案数。

子集 ln

原理

\(\ln 0\) 无意义,这使人很自闭,我们只好去考虑 \(\ln(1+x)=\sum_{i=1}(-1)^{i+1}x^i/i\)。这个东西不太好看啊!但是这个定义是很好的。我们再次声明 \([x^\varnothing]F(x)=0\)。

然后复读一遍 \(\exp\) 的过程,考虑 \(O(n^2)\) 的 \(\ln\):

计算

设 \(G(x)=\ln(1+F(x))\)。注意 \(G(0)=0\)。两边同时求导:

\[G'(x)=\frac{F'(x)}{1+F(x)}\implies G'(x)(1+F(x))=F'(x) \]

两边提取 \([x^{n-1}]\) 项系数:

\[nf_n=ng_n+\sum_{i=0}^{n-1}(i + 1)g_{i + 1}f_{n-i-1}=ng_n+\sum_{i=1}^nig_if_{n-i} \]

注意这里不是出现了两次 \(ng_n\) 而是有一个 \(ng_n\) 的系数为 \(f_{n-n}=0\)。

\[nf_n=ng_n+\sum_{i=1}^{n-1}ig_if_{n-i} \]

组合意义

想必是将 \(S\) 划分为若干不相交外面无序内部无序集合的方案数。(?对这里有疑问)

子集 k-exp

LOJ#154. 集合划分计数

即求出 \(\sum_{i=1}^K(F(x))^i/(i!)\)。考虑记为 \(G\),然后注意 \(G(0)=0\)。然后两边求导:

\[G'(x)=\sum_{i=1}^K\frac{iF(x)^{i-1}F'(x)}{i!}=F'(x)\sum_{i=1}^K\frac{F(x)^{i-1}}{(i-1)!}=F'(x)(G+1-(F(x))^K/K!). \]

假如已经求出 \(H(x)=(F(x))^K\)。那么提取 \([x^{n-1}]\):

\[ng_n=\sum_{i=1}^nif_i(g_{n-i}+[n=i]-h_{n-i}/K!) \]

那么怎么求 \(H(x)=(F(x))^K\) 呢?两边求导:

\[H'(x)=KF(x)^{K-1}F'(x)=KH(x)F'(x)/F(x) \]

\[H'(x)F(x)=KH(x)F'(x) \]

提取 \([x^{n-1}]\) 项系数?

\[\sum_{i=1}^nih_if_{n-i}=K\sum_{i=1}^nif_ih_{n-i} \]

竟然能算?\(O(n^2)\)。这里截断到 \(x^{n+1}\) 即可,因为我们只需要答案的 \([x^n]\)。注意还要将没有常数项的 \(f\)。

代码问号了

记得调哦 https://loj.ac/s/2042781

标签:2024.4,卷积,sum,幂级数,FWT,子集,exp,集合
From: https://www.cnblogs.com/caijianhong/p/18120012

相关文章

  • 2024.4.7每日一题
    mysql1.创建索引idx_emp_no,查询emp_no为10005,使用强制索引forceindex(idx_emp_no)2.现在在last_update后面新增加一列名字为create_date,类型为datetime,NOTNULL,默认值为'000000:00:00'这里的默认值要写成,我还不知道为什么要这样default'2020-10-0100:00:00'java1......
  • 2024.4 做题纪要
    aaaaaaaaaaaaaaaaa大致是在成七集训,虽然挺多都是3月底的不过还是整一下。目录2024.3.30T2简单题2024.4.1T3木棍AGC059EGrid3-coloring2024.4.2T1斩首(Gym104901F)T3战争2024.4.5T3Text2024.4.7CF1707DPartialVirtualTreesCF1874EJellyfishandHack2024.3.30T2......
  • 2024.4.7
    2024.4.7【南天寂静亮星少,北落师门赛明灯。】Sunday二月三十<theme=oi-"search">A.填充单词题目描述小C认识很多单词,但是他并不喜欢其中的一些单词。具体地说,如果一个单词包含连续的3个元音字母,或连续的3个辅音字母,或者1个“L”字母都不包含的话,这个单词是不被小C喜......
  • 2024.4.7 向量化编程AVX/NEON
    基本介绍X86:Intelx86是英特尔公司于1978年推出的16位微处理器;而x86泛指一系列基于Intel8086且向后兼容的中央处理器指令集架构IntelICC和开源的GCC编译器支持SSE/AVX指令的C语言接口(intrinsic,内置函数),在intrinsic.h头文件中(头文件可能有所不同)函数命名:第一部分:mm/mm256......
  • 2024.4.6 组合数学补题
    CF128CGameswithRectangle个人认为突破点是“严格包含”,一开始没注意严格不知道怎么处理。严格的话就是横竖分别在若干条边中,分别选出2k条边。横竖互不影响可以乘法原理,只考虑一个方向即可。#include<iostream>#include<cstdio>#include<algorithm>#definemaxn10000......
  • 迭代方法代替卷积来构造相位差
         在生成蓝牙GFSK信号时,GFSK滤波器的FPGA实现,传统的实现方法需消耗DSP,用迭代计算替代卷积运算,能实现LUT资源替代DSP资源,进而节约DSP。下面介绍其步骤:1、原始公式。其中x(n)为输入信号、h(n)为高斯整形滤波器,y(n)为输出信号。2、假设初始条件(为了调制从已知情......
  • 2024.4.6练习笔记
    浙江理工大学2024年程序设计竞赛(同步赛)Fleetcode题目要求:求出一个序列中对于每个位置\(i\),以\(i\)为起点第一个\(\text{leetcode}\)子序列的终止位置。需要注意的是不要求子序列连续。不存在则答案为零。容易想到双指针,但是会TLE,考虑一些优化。扫描序列,字母是属于......
  • 2024.4.6 - 4.12
    SatJOI2023Final宣传2\(n\)个人,每个人有住所位置\(X_i\)与影响力\(E_i\),一个人\(i\)拿到书后会号召另一个人\(j\)买书仅当\(|X-i-X_j|\leqE_i-E_j\),你最少送多少个人书才能使得所有人都会有书(送的或者被号召买书)。\(n\leq5\times10^5\)。拆一下绝对值,得:\[......
  • 2024.4.5 RMQ补题
    P2048[NOI2010]超级钢琴前缀和处理连续子段的和弦,然后rmq求最大值运用堆存储最优答案每次取出堆头统计一次后,除掉统计点再分成两段加入即可,共k次#include<bits/stdc++.h>#definemaxn500010#defineINF0x3f3f3f3f#defineintlonglongusingnamespacestd;int......
  • R语言数据操纵:如何构建子集
    目录向量的子集矩阵的子集数据框的子集列表的子集如何处理缺失值向量化操作构建子集的基本方法:1.使用[]提取一个或多个类型相同的元素2.使用[[]]从列表或者数据框中提取元素3.使用$按名字从列表或数据框中提取元素向量的子集比如有一个向量x,他的内容是1到5,我们使......