高精度乗算(FFTボード

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')で。
}

 

おすすめ

転載: www.cnblogs.com/wzgg/p/11515672.html