有没有用这个板子的大佬 教教咋用呀...
查看原帖
有没有用这个板子的大佬 教教咋用呀...
596291
Qust_yanzhenbin楼主2023/9/26 19:25

想问一下这里FFT_MAXN 和 N 需要注意点什么呀// 板子是偷来的 不太会用 特别容易RE qwq

#include <bits/stdc++.h>
#define pb push_back
using namespace std;

// FFT_MAXN = 2^k
// fft_init() to precalc FFT_MAXN-th roots

#define rep(i, a, b) for (int i = a; i < (int)b; i++)

typedef long long ll;
typedef double db;
const int FFT_MAXN = 262144 << 3, N = 1000010 << 1;
const db pi = acos(-1.);

struct cp {
	db a, b;
	cp operator + (const cp &y) const { return (cp){a + y.a, b + y.b}; }
	cp operator - (const cp &y) const { return (cp){a - y.a, b - y.b}; }
	cp operator * (const cp &y) const { return (cp){a * y.a - b * y.b, a * y.b + b * y.a}; }
	cp operator !() const { return (cp){a, -b}; }
} nw[FFT_MAXN + 1]; int bitrev[FFT_MAXN];

void dft(cp *a, int n, int flag = 1) {
	int d = 0; while ((1 << d) * n != FFT_MAXN) d++;
	rep (i, 0, n) if (i < (bitrev[i] >> d)) swap(a[i], a[bitrev[i] >> d]);
	for (int l = 2; l <= n; l <<= 1) {
		int del = FFT_MAXN / l * flag;
		for (int i = 0; i < n; i += l) {
			cp *le = a + i, *ri = a + i + (l >> 1), *w = flag == 1 ? nw : nw + FFT_MAXN;
			rep (k, 0, l >> 1) {
				cp ne = *ri * *w;
				*ri = *le - ne, *le = *le + ne;
				le++, ri++, w += del;
			}
		}
	}
	if (flag != 1) rep (i, 0, n) a[i].a /= n, a[i].b /= n;
}

void fft_init() {
	int L = 0; while ((1 << L) != FFT_MAXN) L++;
	bitrev[0] = 0; rep (i, 1, FFT_MAXN) bitrev[i] = bitrev[i >> 1] >> 1 | ((i & 1) << (L - 1));
	nw[0] = nw[FFT_MAXN] = (cp){1, 0};
	rep(i, 0, FFT_MAXN + 1) nw[i] = (cp){cos(2 * pi / FFT_MAXN * i), sin(2 * pi / FFT_MAXN * i)}; // very slow	
}

void convo(db *a, int n, db *b, int m, db *c) {
	static cp f[FFT_MAXN >> 1], g[FFT_MAXN >> 1], t[FFT_MAXN >> 1];
	int N = 2; while (N <= n + m) N <<= 1;
	rep (i, 0, N)
		if (i & 1) {
			f[i >> 1].b = (i <= n) ? a[i] : 0.0;
			g[i >> 1].b = (i <= m) ? b[i] : 0.0;
		} else {
			f[i >> 1].a = (i <= n) ? a[i] : 0.0;
			g[i >> 1].a = (i <= m) ? b[i] : 0.0;
		}
	dft(f, N >> 1); dft(g, N >> 1);
	int del = FFT_MAXN / (N >> 1);
	cp qua = (cp){0, 0.25}, one = (cp){1, 0}, four = (cp){4, 0}, *w = nw;
	rep (i, 0, N >> 1) {
		int j = i ? (N >> 1) - i : 0;
		t[i] = (four * !(f[j] * g[j]) - (!f[j] - f[i]) * (!g[j] - g[i]) * (one + *w)) * qua;
		w += del;
	}
	dft(t, N >> 1, -1);
	rep(i, 0, n + m + 1) c[i] = (i & 1) ? t[i >> 1].a : t[i >> 1].b;
}


db f[N], g[N], h1[N];
int main() {
	fft_init();
	int n, m;
	return 0;
}
2023/9/26 19:25
加载中...