dft等于1时为多项式转化为离散点
dft等于-1时为离散点转化为多项式
做FFT必须使得n为2的次幂,Get_rev()需提前预处理完毕
使用方式(计算多项式乘积):
FFT( a , sum , 1 );
FFT( b , sum , 1 );
for ( int i=0 ; i<sum ; i++ )
a[i] *= b[i];
FFT( a , sum , -1 );
离散化后相乘再转化为多项式
实转虚:利用complex<double>将多项式转化成浮点数
虚转实:(int)(a[i].real()+0.5);
typedef complex<double>CD;
const int maxn = 131075;
const double pi = acos(-1);
int rev[maxn];
void Get_rev( int bit )
{
for ( int i=0 ; i<(1<<bit) ; i++ )
rev[i] = (rev[i>>1]>>1)|((i&1)<<(bit-1));
}
void FFT( CD *a , int n , int dft )
{
for ( int i=0 ; i<n ; i++ )
if ( i<rev[i] )
swap ( a[i] , a[rev[i]] );
for ( int step=1 ; step<n ; step<<=1 )
{
CD wn = exp(CD(0,dft*pi/step));
for ( int j=0 ; j<n ; j+=step<<1 )
{
CD wnk(1,0);
for ( int k=j ; k<j+step ; k++ )
{
CD x = a[k];
CD y = wnk*a[k+step];
a[k] = x+y;
a[k+step] = x-y;
wnk *= wn;
}
}
}
if ( dft==-1 )
for ( int i=0 ; i<n ; i++ )
a[i] /= n;
}