zoukankan      html  css  js  c++  java
  • 省选模拟36 题解

    A. Alchemy

    考虑递归挪动这个塔的过程。

    然后发现有一些递归是没有必要的。

    通过初始状态可以判断递归的前半部分或后半部分是没有必要的。

    直接统计不递归的部分的贡献,然后递归另一部分就好了。

    这样的复杂度应该可以做到线性。

    B. Algebra

    要统计这个答案无非两个办法。找到 $n$,判断在两个进制下的和是否相等。

    找到两个进制下相等的数,然后取交集找到 $n$。

    采用后一种办法。

    考虑首先写一个函数 $next(n,k,s)$ 表示 $geq n$ 的 $k$ 进制下总和为 $s$ 的最小的数字。

    这个函数写一个类似数位 dp 的东西就可以 $O(log n)$ 求出来。

    然后设 $g_s$ 表示 $s$ 的答案至少为 $g_s$。

    那么每次取出最小的 $g_s$,通过 $next(g_s,a,s),next(g_s,b,s)$ 的取值,可以判断是否找到答案。

    如果没有找到答案,那么更新 $g_s$ 。

    C. Anarchy

    暴力的做法是枚举$x,y$,然后计算两点之间的距离。

    然而这个算法不是很好优化,考虑现在枚举 $x$ 和 $y-x$。

    也就是说枚举爆炸点和爆炸向量,然后可以更新对应的 $y$。

    这样的话问题可以写成一个卷积的形式 $ans_y=sum limits_{i oplus j=y}a_i*dis_j$。

    $oplus$ 操作即对位相加在模意义下相等。

    考虑构造一个 $DFT$ ,这个 $DFT$ 实际上就是按照维度依次做一下快速傅里叶变换。

    所以问题是怎么做任意长度 $FFT$。

    要求的是 $b_i=sum limits_{j=0}^{n-1}a_i*w_n^{ij}$,这个 $i*j$ 就很恶心。

    一个处理这个的套路是把 $i*j$ 展开为 $dfrac{(i+j)^2-i^2-j^2}{2}$,于是直接做 $FFT$ 卷积就完事了。

  • 相关阅读:
    Shortcut key for WPF
    Make webclient support upload the large file which are larger than 1G
    Decodes a QuotedPrintable encoded string
    C# USB Detection winform and WPF
    [转] 线程同步
    C# x86应用x64系统上读取x64位应用的注册表
    CSS Sprites图片拼合生成器实现思路
    python 复制文件
    Resources: Tips of Notepad++
    ASP.net MVC与RESTful ROA的思想还是有点区别的
  • 原文地址:https://www.cnblogs.com/skyh/p/12405263.html
Copyright © 2011-2022 走看看