关于FFT

这个博客的讲解超级棒

http://blog.miskcoo.com/2015/04/polynomial-multiplication-and-fast-fourier-transform

算法导论上的讲解也不错

模板就是抄一抄别人的啦

首先是递归版本

 #include <cstdio>
#include <complex>
#include <cmath>
using namespace std; const double pi = acos(-);
const int N = ( << ) + ;
typedef complex<double> cp;
cp A[N], B[N];
int n, m; void FFT(cp *y, int n, int o) {
if (n == ) return ;
cp l[n >> ], r[n >> ];
for (int i = ; i <= n; i++)
if (i & ) r[i >> ] = y[i];
else l[i >> ] = y[i];
FFT(l, n >> , o); FFT(r, n >> , o);
cp omegan(cos( * pi / n), sin( * pi * o / n)), omega(, );
for (int i = ; i < n >> ; i++) {
y[i] = l[i] + omega * r[i];
y[i + (n >> )] = l[i] - omega * r[i];
omega *= omegan;
}
} int main() {
scanf("%d %d", &n, &m);
for (int i = ; i <= n; i++)
scanf("%lf", &A[i].real());
for (int i = ; i <= m; i++)
scanf("%lf", &B[i].real());
m += n;
for (n = ; n <= m; n <<= );
FFT(A, n, ); FFT(B, n, );
for (int i = ; i <= n; i++)
A[i] *= B[i];
FFT(A, n, -);
for (int i = ; i <= m; i++)
printf("%d ", (int)(A[i].real() / n + 0.5));
return ;
}

迭代版本

 #include <cstdio>
#include <cmath>
#include <complex>
#include <iostream>
using namespace std; const int N = << ;
typedef complex<double> cp;
const double pi = acos(-1.0);
cp A[N], B[N];
bool flag;
int a[N], b[N], n, m, tar[N], bit; inline void read(int &ans) {
static char buf = getchar();
ans = ;
for (; !isdigit(buf); buf = getchar());
for (; isdigit(buf); buf = getchar())
ans = ans * + buf - '';
} inline int rev(int val) {
int rst = ;
for (int i = ; i < bit; i++) {
rst <<= ; rst |= val & ; val >>= ;
} return rst;
} inline void FFT(cp *y) {
for (int i = ; i <= bit; i++) {
int fac = << i;
cp omegan(cos( * pi / fac), sin( * pi / fac));
if (flag) omegan.imag() *= -;
for (int j = ; j < n; j += fac) {
cp omega(, );
for (int k = ; k < fac >> ; k++) {
cp t = omega * y[j + k + (fac >> )];
cp u = y[j + k]; y[j + k] = u + t;
y[j + k + (fac >> )] = u - t;
omega *= omegan;
}
}
}
}
int main() {
read(n); read(m); n++; m++;
for (int i = ; i < n; i++) read(a[i]);
for (int i = ; i < m; i++) read(b[i]);
m += n; for (n = ; n < m; n <<= ) bit++;
for (int i = ; i < n; i++) tar[i] = rev(i);
for (int i = ; i < n; i++) A[i].real() = a[tar[i]];
for (int i = ; i < n; i++) B[i].real() = b[tar[i]];
FFT(A); FFT(B);
for (int i = ; i < n; i++) A[i] *= B[i];
for (int i = ; i < n; i++) if (i < tar[i]) swap(A[i], A[tar[i]]);
flag = true; FFT(A);
for (int i = ; i < m - ; i++)
printf("%.0lf ", 0.0001 + A[i].real() / n);
puts("");
return ;
}

UOJ 34: 多项式乘法(FFT模板题)的更多相关文章

  1. UOJ 34 多项式乘法 FFT 模板

    这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+1 个整数,表示第一个多项式的 00 到 nn 次项 ...

  2. [UOJ#34]多项式乘法

    [UOJ#34]多项式乘法 试题描述 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入 第一行两个整数 n 和 m,分别表示两个多项式的次数. 第二行 n+1 个整数,分别表示第一个多 ...

  3. ●UOJ 34 多项式乘法

    题链: http://uoj.ac/problem/34 题解: FFT入门题. (终于接触到迷一样的FFT了) 初学者在对复数和单位根有简单了解的基础上,可以直接看<再探快速傅里叶变换> ...

  4. 【刷题】UOJ #34 多项式乘法

    这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 \(n\) 和 \(m\) ,分别表示两个多项式的次数. 第二行 \(n+1\) 个整数,表示第一个多项式的 \( ...

  5. UOJ#34. 多项式乘法(NTT)

    这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+1 个整数,表示第一个多项式的 00 到 nn 次项 ...

  6. 2018.11.14 uoj#34. 多项式乘法(fft)

    传送门 NOIpNOIpNOIp爆炸不能阻止我搞oioioi的决心 信息技术课进行一点康复训练. fftfftfft板题. 代码: #include<bits/stdc++.h> usin ...

  7. UOJ 34 多项式乘法 ——NTT

    [题目分析] 快速数论变换的模板题目. 与fft的方法类似,只是把复数域中的具有循环性质的单位复数根换成了模意义下的原根. 然后和fft一样写就好了,没有精度误差,但是跑起来比较慢. 这破题目改了好长 ...

  8. 2018.11.14 uoj#34. 多项式乘法(ntt)

    传送门 今天学习nttnttntt. 其实递归方法和fftfftfft是完全相同的. 只不过fftfftfft的单位根用的是复数中的东西,而nttnttntt用的是数论里面有相同性质的原根. 代码: ...

  9. [UOJ 0034] 多项式乘法

    #34. 多项式乘法 统计 描述 提交 自定义测试 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+ ...

随机推荐

  1. JZOJ5988 珂学计树题

    题意 liu_runda曾经是个喜欢切数数题的OIer,往往看到数数题他就开始刚数数题.于是liu_runda出了一个数树题.听说OI圈子珂学盛行,他就在题目名字里加了珂学二字.一开始liu_rund ...

  2. luogu P1736 创意吃鱼法

    #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #i ...

  3. laravle中常见的数据库加密

    // 1.md5加密 $str=md5('123456'); // 2.base64_decode加密 $str2=base64_encode('123456'); // 2.1 base64_解密 ...

  4. CSS:display:none的使用注意事项

    ​总结:display:none  属性会使元素完全隐藏,js无法获得元素,通过js设置style.display="inline-block" 后 js才可获得此元素的属性和内容 ...

  5. JMeter压测MongoDB

    1.下载mongo-java-driver驱动 官方驱动: https://mongodb.github.io/mongo-java-driver/ 或者Maven: https://mvnrepos ...

  6. print不是函数

    对文章阅读有感!!! 文章地址:http://www.laruence.com/2019/03/01/4904.html print是一个语法结构(language constructs), 他并不是 ...

  7. C++中局部变量的返回

    在写 “根据中序和后序遍历顺序,构建树的问题” 时,原本这只是一个非常简单的问题,但是突然发现一直有错误.代码如下: node* get_root(int x1, int x2, int y1, in ...

  8. Linux之温故知新2

    1.关于ssh免密码登陆的ssh-keygen, ssh-copy-id的使用, 然后使用ssh-copy-id user@remote将公钥传给服务器, 以及别名 1 C:\Users\linxmo ...

  9. 逗号运算符与括号 - C语言

    例1 int x; int a=(x=2),12;// 赋值优先级高于逗号,相当于a=x=2,12是多余的 printf("a=%d",a); 结果:a=2 例2 int x; i ...

  10. 【Unity|C#】基础篇(8)——委托(Delegate)/ 事件(Event)

    [学习资料] <C#图解教程>(第13~14章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.bai ...