每天研究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
今日推荐
周排行