標籤: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...