• 「考试」省选37


    今天的题超极棒。

    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)就可以了。
    妙极了。

  • 相关阅读:
    c++11强制转化类型
    关于parent指针以及对话框属性
    关于connect函数(Qt)
    lambda表达式
    学习过程中要注意的一些问题
    自动类型转换
    gakki
    排序算法(2)——简单选择排序和直接插入排序
    [Leetcode]414. Third Maximum Number
    [Leetcode]283. Move Zeroes
  • 原文地址:https://www.cnblogs.com/Lrefrain/p/12404982.html
Copyright © 2020-2023  润新知