高速フーリエ変換は、テンプレートの変換します

テンプレートのタイトル

長い時間を読んで、まだ$のFFT $原理のORZを理解していない、大丈夫、いずれにせよ、唯一のハードパーティションで、恐れることはありません。

ボードを保存し、将来は確かに使用されます。

私は233を理解する必要が次の時間を願っています

書式#include <iostreamの> 
書式#include <stdio.hに> 
する#include <stdlib.h>に含ま
する#include < 文字列の.h> 
の#include <コンプレックス> 
書式#include <math.h>の
 の#define MAXN 3000010
 の#define CPコンプレックス<ダブル>
 使用 名前空間はstd;
constの ダブル PI = ACOS( - 1.0 )。
INTの N、M、REV [MAXN]、LIM = 1 、ビット。
【MAXN] CP、B [MAXN]。

INTはREAD(){
     int型のx = 0、F = 1チャー C = GETCHAR()。
    同時に(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ')、F = - 1 ; C = GETCHAR();}
     一方、(C> = ' 0 ' && C <= ' 9 '){X = X * 10 + C- ' 0 ' ; C = GETCHAR();}
     戻りのx *のF。
} 

ボイド FFT(CP *、int型INV){
     ためint型 i = 0 ; I <LIM。REV [i])とスワップ([I]、[REV [I])。
    INTミッド= 1 ;ミッド<LIM、中間<< = 1 ){ 
        CPのWN(COS(PI * SIN(PI / INV / MID)、MID))。
        以下のためにint型 i = 0 ; I <I LIM + =中間の* 2 ){ 
            W CP(10 );
            int型 J = 0 ; J <ミッド; J ++、* = W WN){ 
                CP X = [iが+ J]は、YはW = * [iが+ J + 中間]。
                A [iが + J] = X + Y = X- [Iがj +中間+] yと、
            } 
        }
    } 
} 

int型のmain(){ 
    N)=(読み取り; M = 読み取ります()。
    以下のためにint型私= 0 ; iが<= N; iが++ )[i]は.real((読み取り))。
    以下のためにint型 i = 0 ; I <= M I ++はB [i]を.real(READ()))を、
    一方、(LIM <= M + N)LIM << = 1、ビット++ 以下のためにint型私= 0 ;私<LIM、私は++)REV [i]は=(REV [I >> 1 ] >> 1)| ((I&1)<<(bit- 1 ))。
    FFT(1)FFT(B、1 );
    以下のためののint i = 0 ; I <= LIM; iは++)[I] = *のB [i]は、
    FFT( - 1 )。
    int型 iは= 0 ; iがM <= N +; iが++)のprintf(" %dの"、(INT)([I] .real()/ LIM + 0.5 ))。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/BakaCirno/p/11762594.html