A * B Problem Plus
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 14007 Accepted Submission(s): 2538
Problem Description
Calculate A * B.
Input
Each line will contain two integers A and B. Process to end of file.
Note: the length of each integer will not exceed 50000.
Output
For each case, output A * B in one line.
Sample Input
Sample Output
Author
DOOM III
Recommend
DOOM III | We have carefully selected several similar problems for you: 1215 1695 1066 1042 1408
FFT模板题:求A*B,用直接相乘TLE(n^2),可以用FFT(nlogn)优化求解。
FFT原理我也理解了好久,这里FFT与多项式相乘的关系还是比较容易理解的。
如图:
附上一个连接: FFT与多项式相乘
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <string.h>
#define LL long long
#define scan(a) scanf("%d",&a)
#define REP(i,a,b) for(int i=a;i<b;++i)
#define mset(a,b) memset(a,b,sizeof a)
//#define maxn 1e6+10
using namespace std;
const double PI = acos(-1.0);
const LL mod = 998244353;
const int maxn = 2e5+10;
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(int 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],str2[maxn];
int sum[maxn];
int main()
{
while(~scanf("%s%s",&str1,&str2))
{
int len1=strlen(str1);
int len2=strlen(str2);
int len=1;
while(len<len1*2 || len<len2*2) len<<=1;
REP(i,0,len1)
x1[i]=Complex(str1[len1-1-i]-'0',0);
REP(i,len1,len)
x1[i]=Complex(0,0);
REP(i,0,len2)
x2[i]=Complex(str2[len2-i-1]-'0',0);
REP(i,len2,len)
x2[i]=Complex(0,0);
fft(x1,len,1);
fft(x2,len,1);
REP(i,0,len)
x1[i]=x1[i]*x2[i];
fft(x1,len,-1);
mset(sum,0);
REP(i,0,len)
{
sum[i]+=int(x1[i].x+0.5);
}
REP(i,0,len)
{
sum[i+1]+=sum[i]/10;
sum[i]%=10;
}
len=len1+len2-1;
while(sum[len] <= 0 && len>0)
len--;
REP(i,0,len+1)
printf("%c",sum[len-i]+'0');
puts("");
}
}