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( ...
随机推荐
- 实现LNMP
实现LNMP 环境: linux系统机器 A:一台N:nginx,ip:192.168.213.251 B:一台P:php-fpm,php-mysql ,ip:192.168.213.253 C:一台 ...
- Apache 403 错误解决方法-让别人可以访问你的服务器
参考网址:http://www.cnblogs.com/mrlaker/archive/2013/04/29/3050888.html http://www.jb51.net/article/6119 ...
- Failed to load the JNI library "E:\JDK6.0\bin\client\jvm.dll"
在打开Eclipse是错误提示:Failed to load the JNI library "E:\JDK6.0\bin\client\jvm.dll" 如图1所示 图1 遇到这 ...
- 利用overflow实现导航栏中常 出现的倒三角下拉小图标
常用网页界面中,导航栏中的倒三角下拉小图标实现,可用overflow: 效果如右图: .Triangle{position:relative;width:280px;height:15px;} ;ov ...
- 关于手残,搞废我的OLED屏幕的 追悼会
2017-12-1913:36:41 昨天按照B站的资料利用esp12F做了一个天气站,可预报天气,惭愧的是模型做好了,照片还没拍就夭折了,可怜了我20块的屏幕,我心伤悲,莫知我哀呀! 本来调试已经成 ...
- linux_文件类型
linux中文件类型? 在linux系统中一切(目录.普通文件.设备文件等)皆文件 d 目录 - 普通文件 l 链接文件 b 快设备和其他外网设备 普通文件: - ...
- Django_项目初始化
如何初始Django运行环境? 1. 安装python 2. 创建Django项目专用的虚拟环境 http://www.cnblogs.com/2bjiujiu/p/7365876.html 3.进入 ...
- 如何从零开始设计一款漂亮的移动APP?
以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 我13岁时开始学习平面设计.我从网上课程学会了设计网站,并习惯于全天使用Photoshop和Affi ...
- POI--HSSFCell类
用POI创建单元格,使用「HSSFCell」类 该类包含三个构造方法. protected HSSFCell(Workbook book, Sheet sheet, int row, CellVal ...
- linkin大话设计模式--策略模式
linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi] 策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...