長い時間を読んで、まだ$の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(1、0 ); 用(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 ; }