多項式係數表示法:
多項式點值表示法
係數表示法算多項式乘法的時間複雜度是o(n^2),而通過點值表示法我們可以發現兩個多項式p,q,同時取點x時,得到的是y1和y2,即取到的點分別為(x,y1),(x,y2)而pq會取到的點為(x,y1y2),那麼計算p*q的點表示式的時間複雜度就是o(n)的。
fft就是將係數表示法轉化成點值表示法相乘,再由點值表示法轉化為係數表示法的過程,第乙個過程叫做求值(dft),第二個過程叫做插值(idft)
模板:
//r這是乙個陣列,用於儲存二進位制反轉的結果
//#define il inline
const
double pi =
acos(-
1.0)
;//圓周率pai
struct node
}a[maxn]
, b[maxn]
; node operator *
(node j, node q)
node operator +
(node j, node q)
node operator -
(node j, node q)
il void
fft(node *j,
double flag)}}
}//在上面涉及到乙個r陣列,
void
getr
(int bit)
//傳入的bit,找到第乙個二的整數次冪使得其可以容納這兩個數的乘積,是陣列的
bit =
1, lim =2;
//bit--第乙個二的整數次冪使得其可以容納這兩個數的乘積,lim = 2^bit;
for(bit=1;
(1<
1;bit++
)lim<<=
1;
例子:
題目描述
給出兩個n位10進製整數x和y,你需要計算x*y。輸入格式
第一行乙個正整數n。 第二行描述乙個位數為n的正整數x。 第三行描述乙個位數為n的正整數y。
輸出格式
輸出一行,即x*y的結果。(注意判斷前導0)
解析:每乙個整數都可以寫成:a0 + a1 * 10 + a2 * 10 ^2 ````````
#include
#include
#include
#define il inline
#define maxn 200100
using namespace std ;
char s1[maxn]
, s2[maxn]
;int n, m, k, res =
0, ans[maxn]
, aa, bb ;
int i, j, k, l, l, r[maxn]
;const
double pi =
acos(-
1.0)
;int bit =
1, lim =2;
struct node
}a[maxn]
, b[maxn]
;//a,b 表示兩個多項式、
node operator *
(node j, node q)
node operator +
(node j, node q)
node operator -
(node j, node q)
il intqr(
)while
(isdigit
(c)) k =
(k <<1)
+(k <<3)
+ c -
48,c =
getchar()
;return k * f ;
} il void
fft(node *j,
double flag)}}
}void
getr
(int bit)
intmain()
while
(!ans[lim]
&& lim >=
1) lim --
; lim ++
;while
(-- lim >=
0) cout << ans[lim]
;return0;
}
HDU 1402 大數乘法 FFT
大整數乘法,給定兩個長度不超過10000的整數,返回乘法的結果。char multi char number a,char number b 有疑問歡迎提問,本人學通訊的,手上有 數字訊號處理 書,可以把圖搬出來解答的 include stdafx.h include include include...
HDU 1402 FFT模板題,求大數乘法
這兩天剛開始看fft,有點雲裡霧裡的,今天看了個模板題,覺得這位聚聚寫得特別好,總算是看懂了多項式相乘之類的運算,存一下。好點複雜一點的演算法,資料結構都不知道,還要慢慢學習。fft模板 define l x 1 x const double pi acos 1.0 const int maxn 1...
FFT高精度乘法
眾所周知,fft fast fourier transformation 即為快速傅氏變換,是離散傅氏變換的快速演算法,它是根據離散傅氏變換的奇 偶 虛 實等特性,對離散傅利葉變換的演算法進行改進獲得的.那麼我們用這個nb的演算法解決一些什麼沙雕問題呢qwq?沒錯!就是大名鼎鼎的高精度乘法 fft太...