UOJ 34: 多项式乘法(FFT模板题)
关于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模板题)的更多相关文章
- UOJ 34 多项式乘法 FFT 模板
这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+1 个整数,表示第一个多项式的 00 到 nn 次项 ...
- [UOJ#34]多项式乘法
[UOJ#34]多项式乘法 试题描述 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入 第一行两个整数 n 和 m,分别表示两个多项式的次数. 第二行 n+1 个整数,分别表示第一个多 ...
- ●UOJ 34 多项式乘法
题链: http://uoj.ac/problem/34 题解: FFT入门题. (终于接触到迷一样的FFT了) 初学者在对复数和单位根有简单了解的基础上,可以直接看<再探快速傅里叶变换> ...
- 【刷题】UOJ #34 多项式乘法
这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 \(n\) 和 \(m\) ,分别表示两个多项式的次数. 第二行 \(n+1\) 个整数,表示第一个多项式的 \( ...
- UOJ#34. 多项式乘法(NTT)
这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+1 个整数,表示第一个多项式的 00 到 nn 次项 ...
- 2018.11.14 uoj#34. 多项式乘法(fft)
传送门 NOIpNOIpNOIp爆炸不能阻止我搞oioioi的决心 信息技术课进行一点康复训练. fftfftfft板题. 代码: #include<bits/stdc++.h> usin ...
- UOJ 34 多项式乘法 ——NTT
[题目分析] 快速数论变换的模板题目. 与fft的方法类似,只是把复数域中的具有循环性质的单位复数根换成了模意义下的原根. 然后和fft一样写就好了,没有精度误差,但是跑起来比较慢. 这破题目改了好长 ...
- 2018.11.14 uoj#34. 多项式乘法(ntt)
传送门 今天学习nttnttntt. 其实递归方法和fftfftfft是完全相同的. 只不过fftfftfft的单位根用的是复数中的东西,而nttnttntt用的是数论里面有相同性质的原根. 代码: ...
- [UOJ 0034] 多项式乘法
#34. 多项式乘法 统计 描述 提交 自定义测试 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+ ...
随机推荐
- 【巨杉数据库SequoiaDB】巨杉数据库 v5.0 Beta版 正式发布
2020年疫情的出现对众多企业运营造成了严重的影响.面对突发状况,巨杉利用长期积累的远程研发协作体系,仍然坚持进行技术创新,按照已有规划推进研发工作,正式推出了巨杉数据库(SequoiaDB) v ...
- 常见sql注入的类型
这里只讲解sql注入漏洞的基本类型,代码分析将放在另外一篇帖子讲解 目录 最基础的注入-union注入攻击 Boolean注入攻击-布尔盲注 报错注入攻击 时间注入攻击-时间盲注 堆叠查询注入攻击 二 ...
- Codeforces Round #616 Coffee Varieties
题意 不太容易讲清,看英文吧 codeforces 做法 先从简单的看起 将块以\(\frac{k}{2}\)个元素为界,然后类似线段树一样递归下去,每次一层的左子树跟右子树的块相互暴力比较 \[\b ...
- 常用的一些git命令整合
一.创建一个版本库 1.mkdir xxx 2.git init 使用git init命令将这个目录变成Git可以管理的仓库 这个版本仓库创建好了,xxx目录下有一个隐藏的.git目录(里面有暂存区( ...
- phpstorm安装bootstrap插件
一个插件可以很好的让我们工作节约时间 Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使得 We ...
- CSS的列表样式和网页背景
CSS的列表样式 1. 设置title和列表 HTML: <!DOCTYPE html><html lang="en"><head> &l ...
- 小程序 与 App 与 H5 之间的区别
小程序的实现原理 根据微信官方的说明,微信小程序的运行环境有 3 个平台,iOS 的 WebKit(苹果开源的浏览器内核),Android 的 X5 (QQ 浏览器内核),开发时用的 nw.js(C+ ...
- numpy学习(二)
练习篇(Part 2) 11. Create a 3x3 identity matrix (★☆☆) arr = np.eye(3) print(arr) 运行结果:[[1. 0. 0.] [0. 1 ...
- (转) maven snapshot和release版本的区别
在使用maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一 天要发布N次.我们知道,maven的依赖管理是基于版本管理的 ...
- android TextView 支持长按自由复制
因为EditText支持系统的长按自由复制,所以只需要把EditText通过配置达到TextView效果就行了 <EditText android:id="@+id/subject_i ...