今天的题超极棒。
T1
汉诺塔问题。
我们考虑把汉诺塔想象成一颗搜索树。
然后在上面找到当前的某一步就相当于递归到最底层。
然后中间判一下合不合法,如果走右儿子就加上左边的贡献就行了。
大概是个noip题。。。
T2
设函数\(next(n,k,s)\)为大于等于\(n\)的\(k\)进制数中,各个位和为\(s\)的最小正整数。
这个玩意可以用一个数位\(dp\)实现,复杂度是\(O(klogn)\),判断一下剩下的位置的最大和是否大于剩下的\(s\)即可。
然后有了这个函数之后我们就可以做了。
一开始设\(g_s=n\)。
然后枚举所有\(s\)中\(g_s\)最小的那个。
然后令\(t=g_s,w=max(next(t,as),next(t,b,s)\)
如果\(t=w\)那么这就是答案。
否则\(g_s=w\)。
一直迭代即可。
T3
大概是懂了。
这个东西相当于做了一个\(K\)维向量卷积。
事实上还是一个高维前缀和。
我们套用\(FWT\)的板子。
然后仍然枚举每一位,把这一位上对位的所有值全部转化为点值。
这样相当于做了\(m\)次点值。
回顾一下\(xorFWT\)的公式:
\[F(a_0,a_1)=(F(a_0)+F(a_1),F(a_0)-F(a_1))\]
\[IF(a_0,a_1)=(\frac{IF(a_0)+IF(a_1)}{2},\frac{IF(a_0)-IF(a_1)}{2})\]
这个东西相当于是在做点值。
因为\(w_2^0=1,w_2^1=-1\),正好是圆上正负一的位置,所以上面那个式子是一个加一个减。
下面那个观察到出现了\(\frac{1}{2}\),正好是离散傅里叶变换中的最后一步,除以模长。
所谓\(xorFWT\)只不过是一种高维前缀和的特殊形式。
这种高维前缀和我们发现直接\(DFT\)不是很妙,因为复杂度是\(O(n^2)\)的。
所以用一个任意模长\(DFT\)就可以了。
妙极了。
原文地址:https://www.cnblogs.com/Lrefrain/p/12404982.html