A * B Problem Plus HDU - 1402 (FFT)
Posted smallhester
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A * B Problem Plus HDU - 1402 (FFT)相关的知识,希望对你有一定的参考价值。
A * B Problem Plus HDU - 1402 (FFT)
Calculate A * B.
InputEach line will contain two integers A and B. Process to end of file.
Note: the length of each integer will not exceed 50000.
OutputFor each case, output A * B in one line.
Sample Input
1 2 1000 2
Sample Output
2 2000
题意:求A*B,A和B的长度都小于50000
题解:FFT的板子题,但FFT还不会,之后再贴一些想法
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<sstream> #include<cmath> #include<stack> #include<map> #include<cstdlib> #include<vector> #include<string> #include<queue> using namespace std; #define ll long long #define llu unsigned long long #define INF 0x3f3f3f3f const double PI = acos(-1.0); const int maxn = 2e5+10; const int mod = 1e9+7; struct Complex{ double x,y; Complex(double _x=0.0,double _y = 0.0){ x = _x; y = _y; } Complex operator -(const Complex &b)const{ return Complex(x-b.x,y-b.y); } Complex operator +(const Complex &b)const{ return Complex(x+b.x,y+b.y); } Complex operator *(const Complex &b)const{ return Complex(x*b.x-y*b.y,x*b.y+y*b.x); } }; void change(Complex y[],int len){ int i,j,k; for( i=1,j=len/2;i<len-1;i++) { if(i<j) swap(y[i],y[j]); k=len/2; while(j>=k) { j -= k; k /= 2; } if(j < k) j += k; } } void fft(Complex y[],int len,int on){ change(y,len); for(int h=2;h<=len;h <<= 1){ Complex wn(cos(-on * 2 * PI /h),sin(-on*2*PI/h)); for(int j=0;j<len;j+=h){ Complex w(1,0); for(int k=j;k<j+h/2;k++){ Complex u = y[k]; Complex t = w*y[k+h/2]; y[k] = u+t; y[k+h/2] = u-t; w = w*wn; } } } if(on == -1) for(int i=0;i<len;i++) y[i].x/=len; } Complex x1[maxn],x2[maxn]; char str1[maxn/2],str2[maxn/2]; int sum[maxn]; int main() { while(scanf("%s",str1) != EOF) { scanf("%s", str2); int len1 = strlen(str1); int len2 = strlen(str2); int len = 1; while(len < len1*2 || len < len2*2) len<<=1; for(int i=0;i<len1;i++) x1[i] = Complex(str1[len1-1-i]-‘0‘,0); for(int i=len1;i<len;i++) x1[i] = Complex(0,0); for(int i=0;i<len2;i++) x2[i] = Complex(str2[len2-1-i]-‘0‘,0); for(int i=len2;i<len;i++) x2[i] = Complex(0,0); fft(x1,len,1); fft(x2,len,1); for(int i=0;i<len;i++) x1[i] = x1[i]*x2[i]; fft(x1,len,-1); for(int i=0;i<len;i++) sum[i] = (int)(x1[i].x + 0.5); for(int i=0;i<len;i++){ sum[i+1] += sum[i]/10; sum[i] %= 10; } len = len1+len2-1; while(sum[len] <= 0 && len > 0) len--; for(int i=len;i>=0;i--) printf("%c",sum[i]+‘0‘); printf(" "); } }
以上是关于A * B Problem Plus HDU - 1402 (FFT)的主要内容,如果未能解决你的问题,请参考以下文章
FFT(快速傅立叶变换):HDU 1402 A * B Problem Plus
hdu 1402 A * B Problem Plus(FFT)
hdu 1402 A * B Problem Plus(FFT)