FFT模板(多项式乘法)
FFT模板(多项式乘法)
标签: FFT
扯淡
一晚上都用来捣鼓这个东西了......
这里贴一位神犇的博客,我认为讲的比较清楚了。(刚好适合我这种复数都没学的)
http://blog.csdn.net/leo_h1104/article/details/51615710
题解
不写点什么也不好,我就简单的说一下吧。
我们首先得知道DFT(离散傅里叶变换)和IDFT(逆离散傅里叶变换)。
一个多项式有很两种表示方法:
法一:\(f(x)=\sum_{i=0}^n A_i*x^i\)
法二:图像上的任(n+1)个点,如\(f(x)=x+1\)就可以用(0,1),(1,2),(2,3)来表示。
法二其实是很适合两个函数的相乘,只需要对应横坐标点的纵坐标相乘。
DFT其实就是将表示法 法一转换成法二,IDFT则相反。
假如DFT使用的点坐标基于实数,那么复杂度为\(O(n^2)\),相比较与基于复数的FFT,效率十分底下。
FFT就使用了单位根的\(0~n-1\)次方作为点的横坐标(这里n需要补成2的次幂),再利用单位根的某些性质,把规模减小一半。可以实现\(O(nlogn)\)的计算。
Code
#include<complex>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define REP(i,a,b) for(int i=(a),_end_=(b);i<=_end_;i++)
#define DREP(i,a,b) for(int i=(a),_end_=(b);i>=_end_;i--)
#define EREP(i,a) for(int i=start[(a)];i;i=e[i].next)
inline int read()
{
int sum=0,p=1;char ch=getchar();
while(!(('0'<=ch && ch<='9') || ch=='-'))ch=getchar();
if(ch=='-')p=-1,ch=getchar();
while('0'<=ch && ch<='9')sum=sum*10+ch-48,ch=getchar();
return sum*p;
}
const int maxn=3e6+20;
int n,m,l,rev[maxn];
complex <double> a[maxn],b[maxn];
void init()
{
n=read();m=read();
REP(i,0,n)a[i]=read();
REP(i,0,m)b[i]=read();
m+=n;
for(n=1;n<=m;n<<=1)l++;
REP(i,0,n-1)rev[i]=(rev[i>>1]>>1) | ((i&1)<<(l-1));
}
const double Pi=acos(-1);
void FFT(complex <double> *p,int opt)
{
REP(i,0,n-1)if(i<rev[i])swap(p[i],p[rev[i]]);
for(int i=1;i<n;i<<=1)
{
complex <double> W(cos(Pi/i),opt*sin(Pi/i));
for(int P=i<<1,j=0;j<n;j+=P)
{
complex <double> w(1,0);
for(int k=j;k<i+j;k++,w*=W)
{
complex <double> x=p[k],y=w*p[k+i];
p[k]=x+y;
p[k+i]=x-y;
}
}
}
if(opt==-1)REP(i,0,n)p[i]/=n;
}
void doing()
{
FFT(a,1);
FFT(b,1);
REP(i,0,n)a[i]=a[i]*b[i];
FFT(a,-1);
REP(i,0,m)printf("%d ",(int)(a[i].real()+0.5));
}
int main()
{
freopen("FFT.in","r",stdin);
freopen("FFT.out","w",stdout);
init();
doing();
return 0;
}
FFT模板(多项式乘法)的更多相关文章
- 洛谷.3803.[模板]多项式乘法(FFT)
题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...
- [模板] 多项式: 乘法/求逆/分治fft/微积分/ln/exp/幂
多项式 代码 const int nsz=(int)4e5+50; const ll nmod=998244353,g=3,ginv=332748118ll; //basic math ll qp(l ...
- P3803 [模板] 多项式乘法 (FFT)
Rt 注意len要为2的幂 #include <bits/stdc++.h> using namespace std; const double PI = acos(-1.0); inli ...
- 洛谷.3803.[模板]多项式乘法(NTT)
题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...
- FFT/NTT总结+洛谷P3803 【模板】多项式乘法(FFT)(FFT/NTT)
前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理 ...
- 洛谷P3803 【模板】多项式乘法(FFT)
P3803 [模板]多项式乘法(FFT) 题目背景 这是一道FFT模板题 题目描述 给定一个n次多项式F(x),和一个m次多项式G(x). 请求出F(x)和G(x)的卷积. 输入输出格式 输入格式: ...
- 洛谷 P3803 【模板】多项式乘法(FFT)
题目链接:P3803 [模板]多项式乘法(FFT) 题意 给定一个 \(n\) 次多项式 \(F(x)\) 和一个 \(m\) 次多项式 \(G(x)\),求 \(F(x)\) 和 \(G(x)\) ...
- 【luogu P3803】【模板】多项式乘法(FFT)
[模板]多项式乘法(FFT) 题目链接:luogu P3803 题目大意 给你两个多项式,要你求这两个多项式乘起来得到的多项式.(卷积) 思路 系数表示法 就是我们一般来表示一个多项式的方法: \(A ...
- 【总结】对FFT的理解 / 【洛谷 P3803】 【模板】多项式乘法(FFT)
题目链接 \(\Huge\text{无图,慎入}\) \(FFT\)即快速傅里叶变换,用于加速多项式乘法. 如果暴力做卷积的话就是一个多项式的每个单项式去乘另一个多项式然后加起来,时间复杂度为\(O( ...
随机推荐
- apache日志管理【转】
web服务器日志轮循比较好的方式有三种:第一种方法是利用Linux系统自身的日志文件轮循机制:logrotate:第二种方法是利用apache自带的日志轮循程序rotatelogs:第三种是使用在ap ...
- UUID.randomUUID().toString()
UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法.UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机 ...
- 图片文档倾斜矫正算法 附完整c代码
2年前在学习图像算法的时候看到一个文档倾斜矫正的算法. 也就是说能将一些文档图像进行旋转矫正, 当然这个算法一般用于一些文档扫描软件做后处理 或者用于ocr 文字识别做前处理. 相关的关键词: 抗倾斜 ...
- jenkins构建自由风格项目[四]
标签(linux): jenkins 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 构建一个php项目 创建一个新的项目 选择从git获取源码 配置gitlab ...
- java 对象、集合的非空判断
自我总结,有什么不到位的地方,请各位纠正补充,感激不尽! 目的:使程序更严谨 ***对象验证是否不为空: if( null != obj ) ***List验证不为空:if( null != lis ...
- elasticsearch-5.x JAVA API(001)
Elasticsearch JAVA API 极其广泛,把所有的方法意义介绍出来显然不太现实.从1.x到2.x,在到5.x,最后到6.0,也不过短短两三年的时间,我挑选了5.4.0版本分三部分把平时常 ...
- squid安装及运行指南
squid安装及运行指南 0. What is squid Squid是一个高性能的代理缓存服务器,Squid支持FTP.gopher.HTTPS和HTTP协议.和一般的代理缓存软件不同,Squid用 ...
- Django的CBV和FBV
一.FBV FBV(function base views) 就是在视图里使用函数处理请求,也是我们最开始接触和使用的方式,普通项目中最常见的方式. urls.py 1 2 3 4 urlpatter ...
- node-glob的*匹配
目录结构 src/js/libs/app.js src/js/index.js 测试脚本 var glob = require('glob') glob('', {}, function (err, ...
- JavaScript 优雅简单的拼接字符串
前言 最近维护一个老系统,里面有大量js拼接字符串的代码,这里总计一下js拼接字符串 JS 原生字符串拼接 JavaScript里面的字符串可以直接用 + 来拼接 return "<a ...