FFT 板题被卡常数
查看原帖
FFT 板题被卡常数
727888
LCATreap楼主2022/6/11 11:47

rt,时间复杂度肯定是对的,FFT 在本地跑第一个测试点用了 5.64s,话说是那里常数太大了?或者说这道题只放 NTT 过了?

#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 10;
#define F(i,a,b) for(int i = a; i < b; i++)
typedef long double ld;
struct cp {
	ld x, y;
	cp() { x = 0.0L, y = 0.0L; };
	cp(ld xx, ld yy) { x = xx, y = yy; }
	cp operator+(cp b) { return cp(x + b.x, y + b.y); }
	cp operator-(cp b) { return cp(x - b.x, y - b.y); }
	cp operator*(cp b) { return cp(x * b.x - y * b.y, x * b.y + y * b.x); }
};
const ld pi = 3.1415926535897932L; cp u, t;
int ans[N], bit = 0, rev[N];
void FFT(cp* a, int n, int f) {
	if (n == 1)return;
	for (int i = 0; i < n; i++)if (i < rev[i]) swap(a[i], a[rev[i]]);
	for (int mid = 1; mid < n; mid <<= 1) {
		cp wn(cos(pi / (ld)mid), (ld)f * sin(pi / (ld)mid));
		for (int i = 0; i < n; i += (mid << 1)) {
			cp w(1.0L, 0.0L);
			for (int j = 0; j < mid; j++) {
				u = a[i + j], t = w * a[i + j + mid];
				a[i + j] = u + t, a[i + j + mid] = u - t;
				w = w * wn;
			}
		}
	}
}
cp a[N], c[N]; int n;
void work() {
	FFT(a, n, 1), FFT(c, n, 1);
	F(i, 0, n)a[i] = a[i] * c[i];
	FFT(a, n, -1);
	F(i, 0, n)ans[i] = int(a[i].x / (ld)n + 0.1L);
	F(i, 0, n)ans[i + 1] += ans[i] / 10, ans[i] = ans[i] % 10;
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(); cout.tie();
	string s1, s2;
	cin >> s1 >> s2;
	F(i, 0, s1.size())a[i].x = ld(s1[s1.size() - i - 1] - '0');
	F(i, 0, s2.size())c[i].x = ld(s2[s2.size() - i - 1] - '0');
	n = 1; int len = s1.size() + s2.size() - 1;
	while (n <= len)n <<= 1, ++bit;
	F(i, 0, n)rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (bit - 1)); work();
	len = s1.size() + s2.size() - 1;
	while (ans[len] == 0 && len)--len;
	for (int i = len; i >= 0; i--)cout << ans[i];
	return 0;
}
2022/6/11 11:47
加载中...