BZOJ2179 FFT快速傅利葉

2021-08-13 11:26:36 字數 2746 閱讀 5377

標籤:fft

題目傳送門

description

給出兩個n位10進製整數x和y,你需要計算x*y。

input

第一行乙個正整數n。 第二行描述乙個位數為n的正整數x。 第三行描述乙個位數為n的正整數y。

output

輸出一行,即x*y的結果。

sample input

1sample output

12資料範圍:

n<=60000

fft模板題,理解起來好困難啊,照著黃學長的**敲的,看來我不適合學習fft。。。

bzoj100題紀念!!!

我們把形如a+bi(a,b均為實數)的數稱為複數,其中a稱為實部,b稱為虛部,i稱為虛數單位。當虛部等於零時,這個複數可以視為實數;當z的虛部不等於零時,實部等於零時,常稱z為純虛數。

其中i是方程x2

=−1 的根,相當於−1

−−−√

(注意只是相當於,易於理解!!!)

將複數的實部與虛部的平方和的正的平方根的值稱為該複數的模,記作∣z

∣ 即對於複數z=

a+bi

,它的模為a2

+b2−

−−−−

−√

稱複數z′=

a−bi

為z的共軛複數。即兩個實部相等,虛部互為相反數的複數互為共軛複數。

運算法則和普通多項式類似

復平面就是將z=

a+bi

在平面上表示為(a,b),x軸為實部單位1,y軸為虛部單位i

係數表達和點值表達

係數表達就是大家常用的表達方式,點值表達就像在這個多項式函式上取n個不同的點,這樣就可以確定原多項式。

舉個栗子

我們通過三點可以確定乙個二次函式,兩點確定一條直線。乙個n次多項式需要n個點(n次多項式意思是有0到n-1次冪的多項式)。f(

x)=x

2+2x

−1可以被表達為(0

,−1)

,(1,

2),(

2,7)

將多項式用點值表達可以快速加法和乘法

這樣算出來的點值表示法,那麼對應的求值點究竟是哪些呢?

答案是2n次單位根。

數學上,n次單位根是n次冪為1的複數。它們位於復平面的單位圓上,構成正n邊形的頂點,其中乙個頂點是1。

複數中1恰好有n個單位根e2

kπi/

n e

ix=c

osx+

isin

x 使用單位根計算點值表示式叫dft(離散傅利葉變換)複雜度o(

n2) ,fft是其分治的優化版,複雜度o(

nlog

n)

//以下部分看不懂的可以跳過(本部分引用自picks部落格

假如我們取單位根的冪進行轉換,會有什麼效果?設a

0(x)

是a(x

) 的偶次項的和,a1

(x) 是奇次項的和。那麼:a(

ωmn)

a(ωm

+n2n

)===

=a0(

(ωmn

)2)+

ωmna

1((ω

mn)2

)a0(

ωmn2

)+ωm

na1(

ωmn2

)a0(

(ωmn

)2)+

ωm+n

2na1

((ωm

n)2)

a0(ω

mn2)

−ωmn

a1(ω

mn2)

即我們只要有了a0

(x)a

1(x)

的點值表示,就能在o(

n)時間內算出a(

x)的點值表示。

#include

#include

#include

#include

#include

#include

#include

#define pi acos(-1)

#define rep(i,a,b) for(int i=a;i<=b;i++)

#define dep(i,a,b) for(int i=a;i>=b;i--)

#define ll long long

#define mem(x,num) memset(x,num,sizeof x)

using

namespace

std;

inline ll read()

while(ch>='0'&&ch<='9')

return x*f;

}const

int maxn=2e5+6;

typedef

complex

e;int n,m,l;

char ch[maxn];

int r[maxn],c[maxn];

e a[maxn],b[maxn];

void fft(e *a,int f)

int main()

dep(i,m,0)printf("%d",c[i]);

return

0;}

BZOJ 2179 FFT快速傅利葉(FFT)

description 給出兩個 n 位 10進製整數 x 和 y,你需要計算x y input 第一行乙個正整數 n 第二行描述乙個位數為 n的正整數 x 第三行描述乙個位數為 n的正整數 y n 60000 output 輸出一行,即x y 的結果。sample input1 3 4sample...

BZOJ2179 FFT快速傅利葉 FFT

給出兩個n位10進製整數x和y,你需要計算x y。第一行乙個正整數n。第二行描述乙個位數為n的正整數x。第三行描述乙個位數為n的正整數y。輸出一行,即x y的結果。13 412資料範圍 n 60000 fft模板題,做的時候注意處理一下進製和前導零就好 1 include2 include3 inc...

BZOJ 2179 FFT快速傅利葉

description 給出兩個n位10進製整數x和y,你需要計算x y。題目分析 fft裸題用來快速計算高精度的乘法,從n 2變成了n。其實不會,隨便抄了乙個模板。以後再慢慢學。include using namespace std const double pi acos 1.0 int rev...