您的位置:首页 > 其它

HDU 1402 A * B Problem Plus FFT入门题

2016-11-05 21:35 357 查看
FFT的理解

大牛的博客1:Ichimei

大牛的博客2:sdj222555

简单的理解

就是对两个多项式乘法求系数

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

const int MAXN = 2e5 + 5;
const double PI = acos(-1.0);

struct complex {
double r, i;
complex(double _r = 0.0, double _i = 0.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;
}

char A[MAXN], B[MAXN];
int ans[MAXN];
complex x[MAXN], y[MAXN];

int main() {
while(~scanf("%s%s", A, B)) {
int lena = 0, len1 = strlen(A);
int lenb = 0, len2 = strlen(B);
while(1 << lena < len1) lena ++;
while(1 << lenb < len2) lenb ++;
int len = 1 << max(lena, lenb) + 1;
for(int i = 0; i < len; i ++) {
if(i < len1) x[i] = complex(A[len1 - i - 1] - '0', 0);
else x[i] = complex(0, 0);
if(i < len2) y[i] = complex(B[len2 - i - 1] - '0', 0);
else y[i] = complex(0, 0);
}
fft(x, len, 1);
fft(y, len, 1);
for(int i = 0; i < len; i ++) {
x[i] = x[i] * y[i];
}
fft(x, len, -1);
for(int i = 0; i < len; i ++) {
ans[i] = (int)(x[i].r + 0.5);
}
for(int i = 0; i < len; i ++) {
ans[i + 1] += ans[i] / 10;
ans[i] %= 10;
}
int flag = 0;
for(int i = len - 1; i >= 0; i --) {
if(ans[i] > 0) {
flag = 1;
printf("%d", ans[i]);
continue;
}
if(flag || i == 0) printf("0");
}
printf("\n");
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: