社区讨论
萌新刚学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 条回复,欢迎继续交流。
正在加载回复...