关于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. 史上最深入浅出的IT术语解读

    假设你是个妹子,你有一位男朋友,与此同时你和另外一位男生暧昧不清,比朋友好,又不是恋人.你随时可以甩了现任男友,另外一位马上就能补上.这是冷备份. 假设你是个妹子,同时和两位男性在交往,两位都是你男朋 ...

  2. 性能优化 && 用户体验

    性能优化 下拉菜单那种最好是点击时候请求,或者是查询时候请求 分页加载 用户体验 有加载.进度条.友好提示

  3. c基本语法和数据类型

    一.C语言结构 C 程序主要包括以下部分: 预处理器指令 函数 变量 语句 & 表达式 注释 二.基本语法 1.  分号是语句结束符. 2. 单行注释//.多行注释/* */. 3. 标识符是 ...

  4. php 获取视频时长

    利用ffmpeg只能获取到本地视频的信息. function video_time($file) { ob_start(); passthru(sprintf(FFMPEG_PATH, $file)) ...

  5. H5_0018:z-index失效的原因

    在做的过程中,发现了一个很简单却又很多人应该碰到的问题,设置Z-INDEX属性无效. 在CSS中,只能通过代码改变层级,这个属性就是z-index, 要让z-index起作用有个小小前提,就是元素的p ...

  6. poj1042题解

    h [1,16] hours all_v=h*12 intervals n [2,25] lakes fi inital intervals fi-di*v v [0,all_v) 题意,做每件事情的 ...

  7. vue koa2 mongodb 从零开始做个人博客(二) 登录注册功能后端部分

    0.效果演示 插入视频插不进来,就很烦.可以出门右拐去优酷看下(点我!). 1.后端搭建 1.1项目结构 首先看一下后端的server目录 挨个解释一下 首先dbs文件夹顾名思义,操作数据库的,mod ...

  8. leetcode - 01

    只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: ...

  9. Educational Codeforces Round 81 (Rated for Div. 2) C. Obtain The String

    题目链接:http://codeforces.com/contest/1295/problem/C 题目:给定字符串s,t.  给定一个空串z,需要按照规则把z构造成 string z == stri ...

  10. 栈和队列----设计一个有getMin功能的栈

    设计一个有getMin功能的栈 设计一个具有getMin功能的栈,可以返回栈中的最小的元素,可以使用现有的栈的数据结构,要求pop/push/getMin操作的时间复杂度是O(1). package ...