#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<complex>
#define SF scanf
#define PF printf
#define DPI (PI*2)
using namespace std;
typedef long long LL;
struct cpx {
double re, im;
cpx () {}
cpx (double _a, double _b) : re(_a), im(_b) {}
cpx operator + (const cpx &t) {
return cpx(re + t.re, im + t.im);
}
cpx operator - (const cpx &t) {
return cpx(re - t.re, im - t.im);
}
cpx operator * (const cpx &t) {
return cpx(re * t.re - im * t.im, im * t.re + re * t.im);
}
} ;
cpx EXP(double theta)
{
return cpx(cos(theta), sin(theta));
}
const double PI = acos(-1.0);
const int MAXN = 200000;
char A[MAXN+10], B[MAXN+10];
cpx xi[MAXN+10], xo[MAXN+10], yi[MAXN+10], yo[MAXN+10];
int ans[MAXN+10];
void FFT (cpx *X, int n, int dir)
{
for(int i = 0, j = 0; i < n; i++) {
if(j > i) swap(X[i], X[j]);
int k = n;
while(j & (k >>= 1)) j ^= k;
j |= k;
}
for(int step = 1; step < n; step <<= 1) {
double angle = dir * PI / step;
for(int k = 0; k < step; k++) {
cpx omegak = EXP(angle * k);
for(int Ek = k; Ek < n; Ek += step << 1) {
int KK = Ek + step;
cpx t = omegak * X[KK];
X[KK] = X[Ek] - t;
X[Ek] = X[Ek] + t;
}
}
}
}
int main()
{
while(~SF("%s%s", A, B)) {
int len1 = strlen(A) << 1, len2 = strlen(B) << 1;
int len = 1, Maxl = max(len1, len2);
while(len < Maxl) len <<= 1;
for(int i = 0; i <= len; i++) {
if(i < (len1 >> 1)) {
xi[i].re = A[i] - '0';
xi[i].im = 0;
}
else xi[i].re = xi[i].im = 0;
}
for(int i = 0; i <= len; i++) {
if(i < (len2 >> 1)) {
yi[i].re = B[i] - '0';
yi[i].im = 0;
}
else yi[i].re = yi[i].im = 0;
}
FFT(xi, len, 1);
FFT(yi, len, 1);
for(int i = 0; i < len; i++) xi[i] = xi[i] * yi[i];
FFT(xi, len, -1);
for(int i = 0; i < len; i++) xi[i].re /= len;
int over = len = 0;
for(int i = ((len1 + len2) >> 1) - 2; i >= 0; i--) {
int t = xi[i].re + over + 0.5;
ans[len++] = t % 10;
over = t / 10;
}
while(over) ans[len++] = over % 10, over /= 10;
len--;
while(len >= 0 && !ans[len]) len--;
if(len < 0) len = 0;
for(int i = len; i >= 0; i--) PF("%d", ans[i]);
puts("");
}
}[HDU1402] A * B Problem Plus && FFT模板
最新推荐文章于 2021-10-21 20:07:10 发布
本文介绍了一种利用快速傅里叶变换(FFT)进行多项式乘法的方法,并给出了详细的C++代码实现。该方法可以高效地计算两个多项式的乘积,尤其适用于处理大规模数据集。
339

被折叠的 条评论
为什么被折叠?



