问题1.1 前缀和与差分:对于矩阵(二维数组)(fi,j)n×m,令 gi,j=x=1∑iy=1∑jfx,y。
一个众所周知的计算方法是按照递推式 gi,j=gi−1,j+gi,j−1−gi−1,j−1+fi,j 逐行列递推填表。
请你给出另一种已知 f 求 g 的算法,并给出一种已知 g 求 f 的算法。
问题1.2 能否把上述的 2 维情形的问题推广到 3 维?或者进一步推广到 n 维?
问题2.1 考虑 n 维,每一维都是 0/1 的情形(此时坐标是一个 01 向量,不妨看成集合),设 g(S)=T⊂S∑f(T),若已知 g,能否反推出 f(S)?尝试证明你的结论。
问题2.2 类似的,考虑“后缀和”的情景,g(S)=T⊂S∑f(T),已知 g,能否反推出 f(S)?
问题2.3 二项式反演:若 f(S) 只与 ∣S∣ 有关,令 f(S)=f∣S∣,尝试重写上面的式子?
问题2.4 应用:一个有 N 个元素的集合有 2N 个不同子集(包含空集),现在要在这 2N 个集合中取出若干集合(至少一个),使得它们的交集的元素个数为 K,求取法的方案数,答案模 109+7。[BZOJ2839 集合计数]
问题2.5 莫比乌斯函数与莫比乌斯反演:定义莫比乌斯函数 μ:若 n 含有平方因子,μ(n)=0;否则 μ(n)=(−1)w(n),其中 w(n) 为 n 的质因子个数,试证明:d∣n∑μ(d)=[n=1]。
问题3.1 与/或卷积:对于已知函数 f0,⋯,2n−1,设 gx=y∣x=x∑fy,px=y&x=x∑fy,回顾求高维前缀和的方法,能否用类似的思想求出 g 数组和 p 数组?
问题3.2 给出 2n 个数:a0,a1,⋯,a2n−1。之后对于 1≤k≤2n−1,求出:i∣j≤kmaxai+aj [ARC100E]
答案
说实话,今天听得有点懵
问题1.1
设数组 gi,j′=gi,j−1′+fi,j
然后设数组 gi,j′′=gi−1,j′′+gi,j′
每一维单独进行计算
如何理解?
把一维理解成一个多项式,如果把一个数列 {an} 抽象成一个多项式函数 f(x),则变成 f(x)=a0x0+a1x1+⋯+anxn
如果变成 {an} 的前缀和,那就是 F(x)=a0x0+(a0+a1)x1+(a0+a1+a2)x2+⋯+(a0+a1+⋯+an)xn
发现 F(x)=f(x)⋅(1+x+x2+⋯+xn)
同理,如果变成一个二维矩阵,可以理解为 F(x,y)=(0≤i≤n∑0≤j≤n∑ai,jxiyj)⋅(1+x+y+xy+x2+y2+⋯)=(0≤i,j≤n∑ai,jxiyj)⋅(i=0∑nxi)⋅(i=0∑nyi)
这样便是同一维一样的形式了,因而可以拆开一维一维求,不会影响。这就是生成函数
其中,1+x+x2+⋯=1−x1,怎么证明?
令 A=i=0∑∞xi,则 xA=i=1∑∞xi
两式相减,得 (x−1)A=1,化简得 A=1−x1
或者,考虑到因式分解的角度,给 A 乘上一个 1−x,得到 A(1−x)=1,因而 A=1−x1,可以理解为逆元操作,且逆元唯一
-
形式幂级数,这是 1−x1 的泰勒展开式,但是它具有收敛半径 R=(−1,1),二者的值只在这个范围内相等
-
定义除法:若 a⋅b=c,则 a=bc
在形式幂级数上,可以理解为对于每一维的变量 xi 乘以了 1−xi1
差分同理,相当于对于每一维除以 1−xi1,即等价于乘以了 1−xi
问题1.2
gx0,x1,⋯,xn−1=S⊆{0,⋯,n−1}∑(−1)∣S∣g{xi(xi∈S),xi−1(i∈/S)}+fx0,x1,⋯,xn−1
容斥原理计算高维前缀和差分,时间复杂度 O(2n)
但是可以像问题1.1一样进行每一维单独的前缀和或差分
问题2.1
对于一个集合的幂集,也可以理解为一种前缀和,长为 n 的集合相当于包含了一个 n 维的坐标,第 i 维是 0 表示不选,1 表示选,因而对于 T⊂S 而言,代表 T≺S
如果需要从前缀和反推,就相当于差分,完全可以理解为子集和的差分
代码形式:
for(int i=0;i<n;i++)
for(int S=0;S<(1<<n);S++)
if((S>>i)&1)
a[S]-=a[S^(1<<i)];
某种程度上,这个叫做莫比乌斯变换(FMT),本质就是高维前缀和或差分
问题2.2
后缀和与前缀和几乎相同,只不过枚举顺序倒过来而已
问题2.3
二项式反演,可以写成高维前缀和公式对应:
设 U 为全集,则 {an}{bn} 两个数列的下标为 U 的所有子集 S
则本质为 bS=T⊆S∑aT,aS=T⊆S∑(−1)∣T∣−∣S∣bT
定义数列 {an′},每一项运算规则为 ai′=∣S∣=i∑aS=j≤i∑(−1)j−ibj′
同理定义 {bn′},其中 bi′=∣S∣=i∑bS=j≤i∑(−1)j−iaj′
问题2.4
容斥原理
考虑让两个集合交集恰好为 S,其中 ∣S∣=K,由于交集的限制较烦,考虑去掉“只包含 S”的限制
设 aS 表示交集恰好为 S 方案数,bS 表示交集包含 S 的方案数,因而 bS=T⊇S∑aT
因而 {bn} 有 22n−∣S∣−1 种。然后差分回去即可。
问题2.5
对于整数的整除关系,可以理解为高维坐标,如 60=22×3×5,因而理解为 60=(2,1,1,0,⋯),即把整数想象成无穷维的坐标中的点,第 i 维的坐标代表有多少个质因子 pi,其中 pi 表示第 i 个质数。
定义 ci×j=ai×bj 表示无穷维的数列乘法,即高维情况下的下标加法,即 ci×j,k=ai,k+bj,k
前缀和 Si=j×k=i∑aj,等价于枚举了 i 的所有因数,即 Si=j∣i∑aj
同理适用于差分。
对于一维差分,本身等价于乘以 1−x,如果写成无穷维的向量,就是 (1,−1,0,0,⋯),因而等价于对于每一维乘上这样一个向量的变换,即 a=S×μ,其中 μ 的每一维都是 v=(1,−1,0,0,⋯),μ 就是莫比乌斯函数
莫比乌斯函数 μ(x)=∏v(ci),其中 x=p1c1p2c2⋯,p1,p2,⋯ 均为质数
问题3.1
如果把按位与和按位或理解为高维坐标的话,按位与运算相当于每一维取 min,按位或运算相当于每一维取 max
g 相当于枚举子集,即高维前缀和;p 就相当于高维后缀和。
进一步的,如果计算 hx∣y=fx×gy,定义 Fx=t⊆x∑ft,G 和 H 同理,则有 Hx=Fx×Gx,即快速莫比乌斯变换
问题3.2
对 a 做一个下标子集和,若 i 是 S 的子集,j 也是 S 的子集,那么 i∣j 恰好就是 S 的所有子集的枚举,因而可以利用前缀和容斥做。
但是,i∣j⊆k 有点问题,无法保证 i∣j≤k,不过幸好 max 可以重复贡献
有帮助,赞一个