https://www.luogu.org/problem/P1919
#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> する#include <複合> 名前空間STDを使用して、 int型のn; 複雑な<ダブル> CDのtypedef。 #define MAXL 2097153 の#define PI 3.14159265358979 チャーS1 [MAXL]、S2 [MAXL]。 CD [MAXL]。 CD [MAXL] B; int型のREV [MAXL]。 ボイドget_rev(INTビット) { (I = 0 int型、iが(1 <<ビット)<; I ++の)のための REV [I] =(REV [I >> 1] >> 1)|((I&1)<<(ビット-1))。 } ボイドFFT(CD *、nは、INT DFT INT) { ため(INT i = 0; iがN <、iは++)スワップ([I]、[REV(iはREV [I]を<)場合は[I] ]); (ステップ<< = 1;ステップ<N INTステップ= 1)のために { CD WN = EXP(CD(0、DFT *のPI /ステップ)); { 以下のために(INT i = 0; I <L2; iは++)B [I] =(ダブル)(S2 [L2-I-1] - [ (; K <J + kはステップ++のint K = J)のために { CD X = A [K]。 CDのY = WNK * [K +工程]。 A = X + Y [K]と、 [K +ステップ]は、XYを=。 WNK * = WN。 } } } (DFT == - 1)の場合のための(I = 0 int型、iがN <; I ++)は、[I] / = N。 } INT出力[MAXL]。 INTメイン() { //freopen("fft.in","r",stdin)。 scanf関数( "%sの%sの"、S1、S2)。 INT L1 = STRLEN(S1)。 INT L2 = STRLEN(S2)。 INT S = 2、ビット= 1。 (;(1 <<ビット)<L1 + L2-1;ビット= 1ビット++用)S << = 1; //は多分"-1"に優れて拭い I <L1; I ++のための(I = 0をint型を)[I] =(ダブル)(S1 [L1-I-1] - '0')。 //(I = 0 int型、iが8 <; I ++の)のためのprintf( "%D%D \ n"は、I、REV [I])。 get_rev(ビット)。 FFT(s、1)。 FFT(B、S、1); 以下のために(INT i = 0; iがSを<; iは++)[I] * = bの[I]; FFT(S、-1); 以下のために(INT i = 0; iがSを<; iは++) { 出力[I] + =(INT)([I] .real()+ 0.5); //取实数四舍五入、此时虚数部分应当为0或由于浮点误差接近0 出力[I + 1] + =出力[I] / 10。 出力[I]%= 10。 } 私はint型。 用(!I = L1 + L2、出力[I] && I> = 0; i--)。 もし(I == - 1)のprintf( "0"); 用(; I> = 0; i--)のprintf( "%dの"、出力[I])。 putchar( '\ n')で。 }