要点:
①A(x) = A1(x)+ wnk*A2(x)
A(x+n/2) = A1(x)-wnk*A2(x)
②单位圆的两个复数相乘得到的是角度相加后单位圆上对应的复数(模长相乘,极角相加)
③重新转回系数表示,FFT用的是共轭复数,最后还要除以问题的规模
NTT用的是规模的逆元
④NTT每个规模n下对应的一单位是原根g^((mod-1)/n)
FFT具体每一层每个位置上的数的含义:
可以看出,是利用性质,使得每一层的问题所需要带入的未知数减少一半,到了最后一层只需要一个未知数就行了。
如果能根据上面的图知道怎么分治,代码忘记了重写也会相对容易。
NTT和FFT降复杂度的思路是一致的。
FFT版本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define for1(i,a,b) for (int i=a;i<=b;i++)
#define for0(i,a,b) for (int i=a;i<b;i++)
#define rof(i,a,b) for (int i=a;i>=b;i--)
#define duozu int __T;scanf("%d",&__T);for1(ica,1,__T)
#define fi first
#define se second
void _r(const int&x){scanf("%d",&x);}
void _r(const ll&x){scanf("%I64d