SplittingFoxes2

作者:何中天 钟知闲

关键字:数学,FFT,暴力

题目简述

个格子围成一个圆,编号 。用 表示 号格子上的数, 是非负整数。这个圆圈关于 号位置对称,即

现在给出将 数组做一次循环卷积后的数组 ,求可能的 数组中字典序最小的。如果没有,返回

算法

在sqrt的时候,每一项都有正负两种取值,如果 暴力枚举直接超时。

因为 是关于 对称的,可以发现 也是关于 对称的,所以只用枚举 次。

由于 不一定是 的整数次幂, 所以直接写一个 的 DFT 就好了。

因为 是非负整数,所以求出来的需检验。

时间复杂度

另一种实现

我们可以使用一种不需要考虑精度问题(不涉及浮点数运算)的实现方法,即使用数论变换(NTT)。

首先我们可以选取一个质数 ,满足 ,然后在模 意义下做 DFT 和 IDFT。单位根可以用原根来代替,两者的等价性这里不再赘述。因为如果 ,那么 ,矛盾,所以只要所取的 ,那么对于实数意义下成立的解 ,在模意义下不需要对 取模也一定成立。

这样按照之前的方法求出 种可能的解并一一验证即可。现在的问题在于,如何实现求平方根的操作。实际上就是对于 ,枚举所有可能的 ,使得

显然在模意义下一个数的平方根不会超过两个(设 的模平方根,则 ,即 ,所以 ),因此可以像实数平方根一样枚举正负。至于如何求模平方根,由于 ,可以暴力 预处理每个 内的数的平方以得到平方根。

时间复杂度

results matching ""

    No results matching ""