直接相乘是O(N^2),如果现在有O(nlogn)将系数表达式与点值表达式相互转换的方法,那么就可以转换为点值表达式再去相乘,复杂度2nlogn+n=O(nlogn) #####离散傅里叶变换DFT 离散傅里叶变换可以将信号的时域转换为频域 这个功能也包括将多项式的系数表示转换为点值表示 最高次数为N-1的多项式进行点值表示时,需要选择N个数分别计算函数值,如果任意地选择N个数,仍然需要N^2来计算这些点值. #####单位根 在离散傅里叶变换中,选择的N个数分别是n个n次单位根. n次单位根指的是满足方程x^n=1的复数x,一共有n个,由欧拉公式变换后可以表示成 [待定] 快速傅里叶变换FFT 选定这些数后,由一个神奇的分治算法就可以在nlogn内算出点值表示. 这个算法就叫做快速傅里叶变换. 傅里叶逆变换IDFT 计算出多项式乘积的点值表达式后,仍需要将其转换为系数表达式,这个过程交做傅里叶逆变换,仍然可以用FFT的方法加速. 快速数论变换FNT 适用于模意义下的变换,算法思想与FFT相同,但需要原根而不是单位根 FFT FFT就是指计算离散傅里叶变换时的快速算法,但是在下文中,我们将其视为一种思想,具体指的是由两个系数多项式在nlogn时间内得到系数多项式乘积的过程. 卷积 卷积是适用于fft的更一般更广泛的形式. 卷积是两个向量或函数之间的运算,如果将向量视作多项式的系数,那么卷积就是多项式乘法. 对于两个离散函数f(x),g(x),他们的卷积定义为 $(f⊗g)(x)=\Sigma_{i=0}^xf(i)g(x−i) $ 这个算式同样可以使用fft进行加速运算. 此外,如果需求为 $h(x)=\Sigma_{i=0}^nf(i)g(x+i) $ 则可以进行一次变换 f ′ ( i ) = f ( n − i ) f'(i)=f(n-i) f′(i)=f(n−i) 然后 $h(x)=\Sigma_{i=0}^nf’(n-i)g(x+i) $ 然后就构成了卷积的形式 注意,卷积形式实际上指的是Σf(a)*g(b)中a+b必须相等.且a+b就是卷起来后的值. 在上式中,实际上是将f’g卷积的n+x放在了h(x)处. ##例题 GYM101667 H Rock Paper Scissors #####题意 给定n,m(1=m时才算有效匹配,累加上限可以从