关于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. 洛谷P1551 亲戚

    洛谷P1551 亲戚 原题 题目背景 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 题目描述 规定:x和y是亲戚,y和z是 ...

  2. ASP.NET Identity系列教程-2【Identity入门】

    https://www.cnblogs.com/r01cn/p/5177708.html13 Identity入门 Identity is a new API from Microsoft to ma ...

  3. PAT (Basic Level) Practice (中文)1016 部分A+B (15 分)

    正整数 A 的“D​A​​(为 1 位整数)部分”定义为由 A 中所有 D​A​​ 组成的新整数 P​A​​.例如:给定 8,D​A​​=6,则 A 的“6 部分”P​A​​ 是 66,因为 A 中有 ...

  4. 根据指定id取出数组中指定对象

    // 需求:根据Id取出数组中指定的对象 let arr = [ { id: 1, rotationAngle: 330, target: '目标1' }, { id: 2, rotationAngl ...

  5. ACM-ICPC 2018 徐州赛区网络预赛 Features Track

    签到题 因为一个小细节考虑不到wa了两次 // 一开始没这个if wa了.因为数据中存在同一帧(frame)一个相同的值出现多次,这样子同一个i 后面的同样的特征会把len重置为1 #include ...

  6. 如何在任意文件下启动jupyter notebook,而不用担心环境配置问题

    网上看了很多帖子,说可以写一个bat文件,将bat文件放在你想启动jupyter notebook的地方.可是不行,不能解决我的问题!!!!!!!!!!! 网上是这样说的: ######这为引用### ...

  7. [Python]python去除两个txt文件的重复词汇 python 2020.2.10

    两个txt文件词汇,用换行符分隔.可以用代码将要处理的文件去掉另一个文件所包含的重复内容. 如: a.txt内容为: 衡山 泰山 西湖 紫禁城 b.txt内容为: 泰山 衡山 长白山 张三丰 将a.t ...

  8. webservice后台起调试

    https://blog.csdn.net/smile00_0/article/details/72763114

  9. centos7添加多个网段

    # service network restart是重启所有网卡.例如下面的例子:>ifconfig eth0 up|down>service network restart|start| ...

  10. [CF1304F] Animal Observation - dp,单调队列

    设 \(f[i][j]\) 为第 \(i\) 天在第 \(j\) 个位置放置的最大值,设 \(s[i][j]\) 是第 \(i\) 行的前缀和,则 \[ \begin{align} f[i][j] & ...