关于FFT
  • 板块学术版
  • 楼主封禁用户
  • 当前回复17
  • 已保存回复17
  • 发布时间2020/8/5 11:06
  • 上次更新2023/11/6 21:16:00
查看原帖
关于FFT
356740
封禁用户楼主2020/8/5 11:06

近日背完FFT板子之后自己敲了一遍

#include <bits/stdc++.h>
#define MAXN 3000100
using namespace std;

char s1[MAXN], s2[MAXN];
int n = 0, m = 0, ans[MAXN], a = 0, b = 0, lim = 1, l, r[MAXN];
const double pi = acos(-1.0), eps = 1e-6;

struct Complex {
	double a, b;
	inline Complex(double x = 0, double y = 0) : a(x), b(y) {}
} A[MAXN], B[MAXN];		

inline Complex operator + (Complex x, Complex y) {
	return Complex(x.a + y.a, x.b + y.b);
}
inline Complex operator - (Complex x, Complex y) {
	return Complex(x.a - y.a, x.b - y.b);
}
inline Complex operator * (Complex x, Complex y) {
	return Complex(x.a * y.a - x.b * y.b, x.a * y.b + x.b * y.a);
}


inline void FFT(Complex *c, double opt) {
	for(int i = 0; i < lim; i++)
		if(i < r[i]) swap(c[i], c[r[i]]);
	for(int j = 1; j < lim; j <<= 1) {
		Complex T(cos(pi / j), opt * sin(pi / j));
		for(int k = 0; k < lim; k += (j << 1)) {
			Complex t(1, 0);
			for(l = 0; l < j; l++, t = t * T)  {
				Complex newx = c[k + l], newy = t * c[k + j + l];
				c[k + l] = newx + newy;
				c[k + j + l] = newx - newy;
			}
		}
	}
}

int main(void) {
	gets(s1), gets(s2);
	n = strlen(s1), m = strlen(s2);
	for(int i = n - 1; i >= 0; i--) A[a++].a = s1[i] - 48;
	for(int i = m - 1; i >= 0; i--) B[b++].a = s2[i] -	 48;
	while(lim < n + m) lim <<= 1, l++;
	for(int i = 0; i <= lim; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
	FFT(A, 1), FFT(B, 1);
	for(int i = 0; i <= lim; i++) A[i] = A[i] * B[i];
	FFT(A, -1);
	for(int i = 0; i <= lim; i++) {
		ans[i] += (int) (A[i].a / lim + eps);
		if(ans[i] >= 10) 
			ans[i + 1] += ans[i] / 10, ans[i] %= 10, lim += (i == lim);
	}
	while(!ans[lim] && lim >= 1) lim--;
	lim++;
	while(--lim >= 0) printf("%d",ans[lim]);
	return 0;
}

然后提交上去全WA 背的是第一篇题解

求大佬指教

2020/8/5 11:06
加载中...