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怎么做,他并 ...
随机推荐
- 剖析Qt的事件机制原理(源代码级别)
在用Qt写Gui程序的时候,在main函数里面最后依据都是app.exec();很多书上对这句的解释是,使Qt程序进入消息循环.下面我们就到exec()函数内部,来看一下他的实现原理.Let's go ...
- Linux软件安装及基本概念
apt 基本用法 apt-get [options] install/remove/source 软件包1 [软件包2...] 注意:软件包不要带后缀.deb 常用命令及解释如下: apt下载软件是根 ...
- 全量导入数据 导致solr内存溢出 崩溃问题解决
在 data-config.xml 文件中 增加一个参数即可: batchSize="-1"
- c++用参数返回堆上的空间
<高质量c++和c编程>7.4 指针参数是如何传递内存的一节中写道 void GetMemory(char *p, int num) { p = (char *)malloc(sizeof ...
- shell多线程(3)while循环
start="2018-06-17" end="2018-07-01" min=`date -d "${start}" +%Y%m%d` m ...
- java关键字-interface
1:是用关键字interface定义的. 2:接口中包含的成员,最常见的有全局常量.抽象方法. 注意:接口中的成员都有固定的修饰符. 成员变量:public static final 成员方法:pub ...
- ZooKeeper学习第七期--ZooKeeper一致性原理(转)
转载来源:https://www.cnblogs.com/sunddenly/p/4138580.html 一.ZooKeeper 的实现 1.1 ZooKeeper处理单点故障 我们知道可以通过Zo ...
- springboot如何读取自定义配置项
我们springboot项目有自己默认的配置文件,一般地由application.yml和bootstrap.yml组成,前者是模块的配置,后者是微服务的配置,后台比前者先被框架加载. 我们有时需要自 ...
- Scala 学习之路(十一)—— 模式匹配
一.模式匹配 Scala支持模式匹配机制,可以代替swith语句.执行类型检查.以及支持析构表达式等. 1.1 更好的swith Scala不支持swith,可以使用模式匹配match...case语 ...
- jQuery入门——实现列表的显示隐藏与实现轮播图
列表的显示与隐藏 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head& ...