FFT中的一个常见小问题(递推式)
FFT中的一个常见小问题
这里不细说FFT的内容,详细内容看这些就足以了解大概了
小学生都能看懂的FFT!!!
FFT详解
补充——FFT中的二进制翻转问题
主要是对学习过程中一个容易困扰的小问题进行解释,以便于理解
用FFT将多项式的系数转换为点值时,原系数数组a最后存的是不同的点值,而不是只有第一个是点值
这一点最开始困扰了我很久
设A(x)=a0+a1x+a2x2+...+an−1xn−1
则可将其移项A(x)=(a0+a2x2+...+an−2xn−2)+(a1x+a3x3+...+an−1xn−1)
a的下标为偶数的放在一起A1(x)=a0+a2x+...+an−2xn−1
a的下标为奇数的放在一起A2(x)=a1+a3x+...+an−1xn−1
则A(x)=A1(x2)+xA2(x2)
注意此处为x2所以有
A(-x)=A1(x2)-xA2(x2)
由于单位根的特殊性质,有
性质一 ωnk+n/2+-ωnk
性质二 ωnk=ω2n2k
所以才有了代码中的那两行
for (int i=;i<=mid-;++i){
buf[i]=a[i]+w*a[i+mid];
buf[i+mid]=a[i]-w*a[i+mid];
w=w*wn;
}
也就是说,我们可以由一个答案进而算出另外一个答案,这里可以理解为递推
所以当我们的递归递到最下面一层后往上走时每次都是将目前答案个数扩大两倍,而且这些答案是由不同的x算出来的,而且由于性质一,我们在计算过程中所用到的不同的$ω^{x*k}$是没有问题的
最后附上板子
原题 洛谷P3803 【模板】多项式乘法(FFT)
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = ;
const double pi = acos(-1.0);
struct IO{
template<class T>
IO operator >> (T &res){
res=;
char ch;
bool flag=false;
while ((ch=getchar())>''||ch<'') flag|=ch=='-';
while (ch>=''&&ch<='') res=(res<<)+(res<<)+(ch^''),ch=getchar();
if (flag) res=~res+;
return *this;
}
}cin;
struct complex {
double x,y;
complex (double xx=,double yy=) {x=xx,y=yy;}
};
complex operator + (complex a,complex b) { return complex(a.x+b.x,a.y+b.y);}
complex operator - (complex a,complex b) { return complex(a.x-b.x,a.y-b.y);}
complex operator * (complex a,complex b) { return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
int n,m,bit,len,val;
int rev[maxn];
complex a[maxn],b[maxn],ans[maxn],buf[maxn];
//递归FFT
void FFT (complex *a,int len,int on_off)//on_off=1 : FFT on_off=-1 : IFFT
{
if (len==) return ;
int mid=len/;
for (int i=;i<=mid-;++i) buf[i]=a[i*],buf[i+mid]=a[i*+];
for (int i=;i<=len;++i) a[i]=buf[i];
FFT(a,mid,on_off),FFT(a+mid,mid,on_off);
complex wn=complex(cos(*pi/len),on_off*sin(*pi/len)),w(,);
for (int i=;i<=mid-;++i){
buf[i]=a[i]+w*a[i+mid];
buf[i+mid]=a[i]-w*a[i+mid];
w=w*wn;
}
for (int i=;i<=len;++i) a[i]=buf[i];
}
//非递归FFT
void FFT2 (complex *a,int len,int on_off)//on_off=1 : FFT on_off=-1 : IFFT
{
for (int i=;i<=len-;++i)
if (i<rev[i]) swap(a[i],a[rev[i]]);
for (int i=;i<len;i<<=){
complex wn=complex (cos(pi/i),on_off*sin(pi/i));
for (int j=;j<len;j+=(i<<)){
complex w(,);
for (int k=;k<i;++k){
complex u=a[j+k],t=w*a[i+j+k];
a[j+k]=u+t;
a[i+j+k]=u-t;
w=w*wn;
}
}
}
}
int main ()
{
cin>>n>>m;
for (int i=;i<=n;++i) cin>>val,a[i].x=val;
for (int i=;i<=m;++i) cin>>val,b[i].x=val;
len=;
while (len<=n+m) ++bit,len<<=;
for (int i=;i<=len-;++i) rev[i]=(rev[i>>]>>)|((i&)<<(bit-));
FFT2(a,len,);
FFT2(b,len,);
for (int i=;i<=len;++i) ans[i]=a[i]*b[i];
FFT2(ans,len,-);
for (int i=;i<=n+m;++i) printf("%d ",int(ans[i].x/len+0.5));
return ;
}
如仍有问题或有其它问题可在下方指出,博主看到后会尽力解决,Thanks♪(・ω・)ノ
FFT中的一个常见小问题(递推式)的更多相关文章
- [题解][SHOI2013]超级跳马 动态规划/递推式/矩阵快速幂优化
这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你 ...
- P1067Warcraft III 守望者的烦恼(十大矩阵问题之七求递推式)
https://vijos.org/p/1067 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫“闪烁”,这个技能可以把她 ...
- hdu 1757 A Simple Math Problem (构造矩阵解决递推式问题)
题意:有一个递推式f(x) 当 x < 10 f(x) = x.当 x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + ...
- Tyche 2191 WYF的递推式
题目描述 WYF手中有这样一条递推式 WYF并不是想让你帮他做出结果,事实上,给定一个n,他能够迅速算出Fn.WYF只是想单纯的考验一下读者们. 输入描述 仅一行,三个整数N,F1,P 输出描述 仅一 ...
- 【模板】BM + CH(线性递推式的求解,常系数齐次线性递推)
这里所有的内容都将有关于一个线性递推: $f_{n} = \sum\limits_{i = 1}^{k} a_{i} * f_{n - i}$,其中$f_{0}, f_{1}, ... , f_{k ...
- 51nod1149 Pi的递推式
基准时间限制:1 秒 空间限制:131072 KB 分值: 640 F(x) = 1 (0 <= x < 4) F(x) = F(x - 1) + F(x - pi) (4 <= x ...
- HDU5950 Recursive sequence 非线性递推式 矩阵快速幂
题目传送门 题目描述:给出一个数列的第一项和第二项,计算第n项. 递推式是 f(n)=f(n-1)+2*f(n-2)+n^4. 由于n很大,所以肯定是矩阵快速幂的题目,但是矩阵快速幂只能解决线性的问题 ...
- POJ 3734 Blocks(矩阵快速幂+矩阵递推式)
题意:个n个方块涂色, 只能涂红黄蓝绿四种颜色,求最终红色和绿色都为偶数的方案数. 该题我们可以想到一个递推式 . 设a[i]表示到第i个方块为止红绿是偶数的方案数, b[i]为红绿恰有一个是偶数 ...
- 【瞎讲】 Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18)
[背诵瞎讲] Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18) 看CSP看到一题"线性递推式",不会做,去问了问zsy怎么做,他并 ...
随机推荐
- Delphi Thread.Queue与Synchronize的区别(差别: Synchronize是阻塞,Queue是非阻塞)
前话: 其实大家要学会看源码, 我接下来要说的这些东东,与其等别人讲,还不如自己搞几个代码试一下,印象还深刻点 TThread.Queue和TThread.Synchronize的区别, 效果上:二 ...
- TCP打洞和UDP打洞的区别 (相互直接访问)
为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现? 假设现在有内网客户端A和内网客户端B,有公网服务端S. 如果A和B想要进行UD ...
- Sql一行拆分转多行
select a.planid,b.mias, miaid into [1_cache3] from (select planid,mias=convert(xml,'<root>< ...
- Google+团队如何测试移动应用 - from Google Testing Blog
How the Google+ Team Tests Mobile Apps by Eduardo Bravo Ortiz “移动第一”在当下已成为很多公司的口头禅.但是能够用一种合理的方法来测试移动 ...
- 办公利器-一行代码搞定http服务
平时给内网的同事分享个文件,直接用python启动一个http服务,方便又简洁: python3: python -m http.server [port] 默认端口为8000 python2: py ...
- C# 设计模式,简单工厂
C# 实现计算机功能 (封装,继承,多态) using System; using System.Collections.Generic; using System.Linq; using Syste ...
- iOS开发(4):录音AVAudioRecorder
录音,声音的采集,一般有两种实现办法,一是使用AVAudioRecorder,一是使用AudioUnit.如果只是简单的录音,使用AVAudioRecorder就可以了,如果想更灵活地处理刚录到的声音 ...
- 在网页中添加动画,使用WOW.js来实现
[来源] 页面在向下滚动的时候,有些元素会产生细小的动画效果.虽然动画比较小,但却能吸引你的注意 刚知道wow.js这个插件,之前写的类似滚动时页面效果都是自己用jQuery写的,现在有了插件,开发更 ...
- JAVA复习笔记02
16.interface中的成员变量默认为public static final类型,方法只能是public(默认为public) 17.内部类访问外部类成员: Outer.this.num; 18. ...
- JVM中ClassLoader的学习
JVM中class loaderの学习 一..class文件和jvm的关系 类的加载 所有的编译生成的.class文件都会被直接加载到JVM里面来吗(并不 首先我们明确一个概念,.class文件加载到 ...