国家集训队论文研究


每天研究1篇。

2015年

集合幂级数

扩展fwt:

仿照fwt定义fwt变换。

以下默认变换长度为n

实际上fwt变换是矩阵乘法。
用一个矩阵c乘以向量,得到变换的向量。
设变换的向量为a,b*c=a
当前位是x
$\sum_{i=0}^{n}a[i]c(x,i)=\sum_{j=0}^{n}\sum_{k=0}^{n}c(x,j)b[j]c(x,k)c[k]$
根据fwt的定义

$a[i]=b[j]*c[k]*[i=j\ op\ k]$
两边同时乘c(x,i)
$\sum_{x=0}^{n}c(x,i)a[i]=\sum_{x=0}^{n}b[j]*c[k]*[i=j\ op\ k]$
拆开左边
$\sum_{i=0}^{n}\sum_{j=0}^{n}c(x,i)c(x,j)a[i]b[j]=\sum_{x=0}^{n}\sum_{j\ op\  k}c(x,i)b[j]*c[k]$
$\sum_{i=0}^{n}\sum_{j=0}^{n}c(x,i)c(x,j)a[i]b[j]=\sum_{x=0}^{n}\sum_{j\ op\  k}b[j]*c[k]c(x,j\ op\ k)$
$\sum_{i=0}^{n}\sum_{j=0}^{n}c(x,i)c(x,j)a[i]b[j]=\sum_{j=0}^{p}\sum_{i=0}^{p}b[j]*c[k]c(x,j\ op\ k)$
观察发现$c(i,j)c(i,k)=c(i,j\ op\ k)$
发现每一位独立可以推出上面的公式。
设$d(i,j)$表示i->j的转移系数,i,j拆位后结果为ib,jb数组。
则$d(i,j)=d(ib[0],jb[0])*d(ib[1],jb[1])*....$
所以只要构造出$d(i,j)d(i,k)=d(i,j\ op\ k)$即可。
这个也能推到上面的性质。
这也能构造出fwt的定义式。
折半一下得到
$\sum_{j=0}^{md}c(i,j)a[j]+\sum_{j=md+1}^{n}c(i,j)a[j]$
实际上,前面的式子的首位,后面式子的首位都是相同的。
继续推
$c(ia[0],0)\sum_{j=l}^{md}c(i',j')a[j]+c(ib[0],1)\sum_{j=md+1}^{r}c(i',j')a[j]$
转化为了后面的子问题。
发现前半部分的ia[0]和右半部分的ib[0]是相同的,所以
$c(0,0)\sum_{j=l}^{md}c(i',j')a[j]+c(1,1)\sum_{j=md+1}^{r}c(i',j')a[j]$
fwt推导完成。
and,or,xor卷积直接按照定义即可。
扩展fwt也能类似的推,但是变为k进制数。
fwt的几条重要性质:它的直接定义式可以考虑变换的过程求出。它是线性变换(和的fwt=fwt的和)。fwt的逆变换要乘的矩阵就是原变换矩阵的逆矩阵。如果要乘法,则可以fwt后点乘。

fwt乘法还有一种形式:子集卷积。

定义子集卷积:$f[s|t]+=a[s]*b[t](s\ and\ t==0)$

这样子直接做是O(3^n)的

但是可以使用占位多项式优化。

设f[i][s],f[i][s]只有当i=bitcount(s)时为a[s],否则为0

f[x+y][]+=a[x][]*b[y][]

如果设s的1位数位x,t的为y

则x+y=bitcount(s|t)等价于s&t=0

所以可以对f[i][]作高维前缀和(原因后面再讲),再进行点乘。

这样子时间复杂度是$2^n*n^2$的

实际上,发现f[][j],每一个j在做完后是独立的,f[i][]构成了$2^n$个多项式。

这带给了一些优美的性质。

f[][j]的求逆可在2^n*n^2的时间复杂度内完成,对每个多项式求逆即可。

定义幂级数的导数为$x^S=bitcount(s)x^{s-{t}}$t为任意集合。

发现这个导数的定义满足导数的性质。

只要作高维前缀和,就可以快速计算导数(就是占位多项式的前一位)。

就是对每个多项式求导。

同时推出集合幂级数求ln的做法。

猜你喜欢

转载自www.cnblogs.com/cszmc2004/p/13170149.html
今日推荐