FFT/NTT可以说是非常有名的两个东西,从通信到数学再到计算机领域……
然后我本人接触这个东西也就是在今年暑假的时候。其实呢,到现在,它的变化本质和算法的实现方法我还并不是很了解。但是呢,作为一个ACM选手,能够做到会熟练的运用算法模板,懂得一些变通也就差不多能够算是合格了。而且,FFT/NTT本身也没什么,就是套用模板即可。
下面我就具体说说FFT/NTT怎么用,在什么情况下使用,以及一些注意事项。
首先从最简单的开始。我们在初学的时候,学过一些大整数的乘法,高精度,然后显然,这个复杂度是O(N^2)的,如果数字的位数长一点的话很容易就TLE了,那么有没有什么方法能够优化呢?答案是肯定的。根据大整数乘法的运算方式,我们很容易可以发现,运算发生正好符合卷积的运算,即每一位乘以另一个数字所有位。于是可以用FFT迎刃而解,复杂度为O(NlogN)。
可以看出,FFT/NTT说白了,就是用来计算卷积的一个快速工具。有了这个工具可以解决很多问题。但是,关键是如何把一些问题转换为卷积的形式来计算。在之前多校赛的时候就曾经出过一道题目,具体可以看我的博客。
下面,我就HDU 4656具体的来推导一下。我还是上图吧,字丑勿喷……
在以上的推导中,由于最后的表达式比较复杂