社区讨论

萌新刚学OI,求神佬帮助

P3803【模板】多项式乘法(FFT)参与者 6已保存回复 13

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
13 条
当前快照
1 份
快照标识符
@mi7wrboz
此快照首次捕获于
2025/11/21 04:52
4 个月前
此快照最后确认于
2025/11/21 06:35
4 个月前
查看原帖
刚刚开始学FastFastTLE
照着https://www.cnblogs.com/RabbitHu/p/FFT.html 的思路写的
然后不知道为什么乱七八糟就re了(样例就re)
甚至一调用fft函数就挂掉了,一层都没有递归下去。
求你谷神佬来帮帮我这个垃圾
CPP
#include<iostream>
#include<cstdio>
#include<cmath>
#include<complex>
#include<algorithm>
#define PI acos(-1)
using namespace std;

const int MAXN = 2097152 + 5;

typedef complex <double> cp;

cp w(int n , int k) {return cp(cos(k / n * 2 * PI) , sin(k / n * 2 * PI));}
void fft(cp* a , int n , bool inv) { //[a , a + n)
	if(n == 1) return ;
	cp buf[MAXN]; int m = n / 2;
	for(int i = 0 ; i < m ; ++i) buf[i] = a[i * 2] , buf[i + m] = a[i * 2 + 1];
	for(int i = 0 ; i < n ; ++i) a[i] = buf[i];
	fft(a , m , inv); fft(a + m , m , inv);
	for(int i = 0 ; i < m ; ++i) {
		cp o = w(n , i); if(inv) o = conj(o);
		buf[i] = a[i] + a[i + m] * o , buf[i + m] = a[i] - a[i + m] * o;
	}
	for(int i = 0 ; i < n ; ++i) a[i] = buf[i];
}

int n , m , A[MAXN] , B[MAXN] , C[MAXN] , lg[MAXN];
cp a[MAXN] , b[MAXN] , c[MAXN];

int main() {
	scanf("%d %d" , &n , &m); ++n , ++m;
	for(int i = 2 ; i < MAXN ; ++i) lg[i] = lg[i / 2] + 1;
	for(int i = 0 ; i < n ; ++i) scanf("%d" , A + i);
	for(int i = 0 ; i < m ; ++i) scanf("%d" , B + i);
	int g = max(n , m) << 1; n = m = (1 << (lg[g] + 1)); 
	for(int i = 0 ; i < n ; ++i) a[i] = cp(A[i] , 0) , b[i] = cp(B[i] , 0);
	fft(a , n , 0); fft(b , m , 0);
	for(int i = 0 ; i < n ; ++i) c[i] = a[i] * b[i];
	fft(c , n , 1);
	for(int i = 0 ; i < n ; ++i) printf("%d " , (int)(real(c[i]) / n + 0.5));
	return 0;
}
Code有点压行,但我认为可读性还是挺高的(?)

回复

13 条回复,欢迎继续交流。

正在加载回复...