A * B Problem Plus
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 13959 Accepted Submission(s): 2516
Note: the length of each integer will not exceed 50000.
由於數字信號系統正在學FFT,正好來寫寫相關的問題。
FFT快速求解循環卷積,從而得到線性卷積,具體理論我將整理後再發。
先寫個經典的大數相乘吧XD。
/** Author: ☆·aosaki(*’(OO)’*) niconiconi★ **/
#pragma comment(linker, "/STACK:1024000000,1024000000")
//#include<bits/stdc++.h>
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <functional>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <list>
#include <stack>
//#include <tuple>
#define mem(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define lp(k,a) for(int k=1;k<=a;k++)
#define lp0(k,a) for(int k=0;k<a;k++)
#define lpn(k,n,a) for(int k=n;k<=a;k++)
#define lpd(k,n,a) for(int k=n;k>=a;k--)
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d %d",&a,&b)
#define lowbit(x) (x&(-x))
#define ll long long
#define pi pair<int,int>
#define vi vector<int>
#define PI acos(-1.0)
#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
#define TT cout<<"*****"<<endl;
#define TTT cout<<"********"<<endl;
inline int gcd(int a,int b)
{
return a==0?b:gcd(b%a,a);
}
#define INF 1e9
#define eps 1e-8
#define mod 10007
#define MAX 400044
using namespace std;
char s1[50010],s2[50010];
struct complex
{
double r,i;
complex(double _r = 0,double _i = 0)
{
r = _r; i = _i;
}
complex operator +(const complex &b)
{
return complex(r+b.r,i+b.i);
}
complex operator -(const complex &b)
{
return complex(r-b.r,i-b.i);
}
complex operator *(const complex &b)
{
return complex(r*b.r-i*b.i,r*b.i+i*b.r);
}
};
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].r/=len;
}
complex x1[200010],x2[200010];
int sum[200010];
int main()
{
//freopen("in.txt","r",stdin);
register int i;
while(~scanf("%s%s",s1,s2))
{
int len1=strlen(s1);
int len2=strlen(s2);
int l=1;
while(l<len1*2 || l<len2*2) l<<=1;
for(i=0;i<len1;i++)
{
x1[i].r=s1[len1-i-1]-'0';
x1[i].i=0.0;
}
for(;i<l;i++)
x1[i].r=x1[i].i=0.0;
for(i=0;i<len2;i++)
{
x2[i].r=s2[len2-i-1]-'0';
x2[i].i=0.0;
}
for(;i<l;i++)
x2[i].r=x2[i].i=0.0;
fft(x1,l,1);
fft(x2,l,1);
for(i=0;i<l;i++) x1[i]=x1[i]*x2[i];
fft(x1,l,-1);
for(i=0;i<l;i++) sum[i]=x1[i].r+0.5;
for(i=0;i<l;i++)
{
sum[i+1]+=sum[i]/10;
sum[i]%=10;
}
l=len1+len2-1;
while(sum[l]<=0 && l>0) l--;
for(i=l;i>=0;i--) putchar(sum[i]+'0');
putchar('\n');
}
return 0;
}