FFT调得血压升高
查看原帖
FFT调得血压升高
551861
strcmp楼主2022/4/28 21:40

rt,几乎与题解一模一样,但DFT计算得就是不对,请求调代码,谢了。

#include <iostream>
#include <complex>
#include <cmath>
using namespace std;
const int N = 2e6 + 10;
typedef long double ld;
typedef complex<ld> cp;
const ld pi = 3.1415926535897932L;
const cp ci(0.0L, 1.0L);
int ans[N]; cp t, u;
int d = 0, bit = 0;
int rev[N]; int n;
void FFT(cp a[], int f) {
	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 * 2) {
			cp w(0.0L, 1.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 *= wn;
			}
		}
	}
}
cp a[N], c[N];
void work() {
	FFT(a, 1), FFT(c, 1);
	for (int i = 0; i < n; i++)a[i] *= c[i];
	FFT(a, -1);
	for (int i = 0; i < n; i++)ans[i] = int(a[i].real() / (ld)n + 0.5L);
	for (int i = 0; i < n; i++)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;
	for (int i = 0; i < s1.size(); i++)a[i] = ld(s1[s1.size() - i - 1] - '0');
	for (int i = 0; i < s2.size(); i++)c[i] = ld(s2[s2.size() - i - 1] - '0');
	n = 1; int len = s1.size() + s2.size() - 1;
	while (n < len)n <<= 1, ++bit; n <<= 1, ++bit;
	for (int i = 0; i <= n; i++)rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (bit - 1));
	work(); len = n - 1;
	while (ans[len] == 0 && len)--len;
	for (int i = len; i >= 0; i--)cout << ans[i];
	return 0;
}
2022/4/28 21:40
加载中...