[UOJ34]FFT && NTT 模板
来源:互联网 发布:恒大淘宝队2017赛程 编辑:程序博客网 时间:2024/03/29 15:57
到底为什么这么慢啊
FFT
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<cmath>#define SF scanf#define PF printfusing namespace std;typedef long long LL;inline int read() {int x = 0, f = 1; char ch = getchar();while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); }while(ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }return x * f;}const int MAXN = 200000;const double PI = acos(-1.0);struct cpx {double re, im;cpx () {}cpx (double a, double b) : re(a), im(b) {}cpx operator + (const cpx &t) const {return cpx(re+t.re, im+t.im);}cpx operator - (const cpx &t) const {return cpx(re-t.re, im-t.im);}cpx operator * (const cpx &t) const {return cpx(re*t.re - im*t.im, re * t.im + im * t.re);}} A[MAXN*4+10], B[MAXN*4+10], fa[MAXN*4+10], fb[MAXN*4+10];int n, m, N;int rev[MAXN*4+10];void fft_init(int n) {N = 1; int lg = 0;while(N < n) N <<= 1, lg++;for(int i = 1; i <= N; i++)for(int j = 1, ii = i; j <= lg; j++, ii >>= 1)rev[i] = (rev[i]<<1) + (ii & 1);}cpx EXP(double alp) {return cpx(cos(alp), sin(alp));}void fft(cpx *a, cpx *out, int sig) {static cpx tmp[MAXN*4+10];for(int i = 0; i < N; i++) tmp[rev[i]] = a[i];for(int step = 1; step < N; step <<= 1) {int dou = step << 1;for(int i = 0; i < step; i++) {cpx wi = EXP(sig * PI * i / step);for(int k = i; k < N; k += dou) {int kk = k + step;cpx u = tmp[k], v = tmp[kk] * wi;tmp[k] = u+v;tmp[kk] = u-v;}}}for(int i = 0; i < N; i++) out[i] = tmp[i];if(sig == -1)for(int i = 0; i < N; i++) out[i].re /= N;}int main() {n = read(); m = read();n++; m++;for(int i = 0; i < n; i++) A[i].re = read();for(int i = 0; i < m; i++) B[i].re = read();fft_init((n+m-1) * 2);fft(A, fa, 1);fft(B, fb, 1);for(int i = 0; i < N; i++) fa[i] = fa[i] * fb[i];fft(fa, fb, -1);for(int i = 0; i < n + m - 1; i++) PF("%d ", (int)(fb[i].re + 0.5));}
NTT
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<cmath>#define SF scanf#define PF printfusing namespace std;typedef long long LL;inline int read() {int x = 0, f = 1; char ch = getchar();while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); }while(ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }return x * f;}const int MAXN = 400000;const int MOD = 998244353;const int G0 = 3;int A[MAXN*2+10], B[MAXN*2+10], fa[MAXN*2+10], fb[MAXN*2+10];int G[MAXN*2+10], rev[MAXN*2+10];int n, m, N, inv;int pow_mod(int x, int k) {int ret = 1;while(k) {if(k & 1) ret = 1LL * ret * x % MOD;x = 1LL * x * x % MOD;k >>= 1;}return ret;}void fft_init(int n) {N = 1; int lg = 0;while(N < n) N<<=1, lg++;int g = pow_mod(G0, (MOD-1) / N);inv = pow_mod(N, MOD-2);for(int i = G[0] = 1; i <= N; i++) G[i] = 1LL * G[i-1] * g % MOD;for(int i = 1; i <= N; i++)for(int j = 1, ii = i; j <= lg; j++, ii >>= 1)rev[i] = (rev[i] << 1) + (ii & 1);}void fft(int *out, int *a, int sig) {static int tmp[MAXN*2+10];for(int i = 0; i < N; i++) tmp[rev[i]] = a[i];for(int step = 1; step < N; step <<= 1) {int dou = step << 1;for(int i = 0; i < step; i++) {int wi = sig > 0 ? G[ i * (N / dou) ] : G[ N - i * (N / dou) ];for(int k = i; k < N; k += dou) {int kk = k+step;int u = tmp[k], v = 1LL * tmp[kk] * wi % MOD;tmp[k] = (u+v) % MOD;tmp[kk] = ((u-v) % MOD+MOD) % MOD;}}}for(int i = 0; i < N; i++) out[i] = tmp[i];}int main() {n = read(); m = read();n++; m++;for(int i = 0; i < n; i++) A[i] = read();for(int i = 0; i < m; i++) B[i] = read();fft_init((n+m-1) * 2);fft(fa, A, 1);fft(fb, B, 1);for(int i = 0; i < N; i++) fa[i] = fa[i] * 1LL * fb[i] % MOD * inv % MOD;fft(fb, fa, -1);for(int i = 0; i < n+m-1; i++) PF("%d ", fb[i]);}
0 0
- [UOJ34]FFT && NTT 模板
- uoj34 多项式乘法【FFT or NTT】
- FFT及NTT模板
- FFT & NTT 学习 模板
- FFT模板(UOJ34多项式乘法)
- NTT FFT 数论变换 快速傅里叶变换 模板
- [uoj 34 多项式乘法] FFT&NTT 模板
- [uoj 34 多项式乘法] FFT&NTT 模板
- FFT uoj34 多项式乘法
- FFT uoj34 多项式乘法
- fft & ntt
- FFT-NTT
- fft/ntt
- 快速傅里叶变换(FFT)和数论变换(NTT)模板
- 初识FFT和NTT
- BZOJ2179【FFT】【NTT】
- FFT、NTT小结
- FFT,NTT学习笔记
- 浮点数非精确数,作比较运算时需谨慎!
- Hadoop层级队列组织方式
- size_t
- 【Streaming】我在拓扑中使用了Ack机制,为什么在Storm UI上有大量Failed数据?
- CentOS7.0安装Nginx 1.7.4
- [UOJ34]FFT && NTT 模板
- Hibernate update 只更新被修改字段
- 概率---面试题
- Java 读取csv文件,经测可用
- 接AD技巧
- 自定义控件
- 【JS】表单、JS在线编辑相关资料收集
- 无法启动Windows安全中心服务怎么办?邪恶的 拷啦快速拷贝 KaolaFastCopy
- warning : WINVER not defined. Defaulting to 0x0600(Windows Vista)