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
    性质二 ωnk2n2k
    所以才有了代码中的那两行

 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中的一个常见小问题(递推式)的更多相关文章

  1. [题解][SHOI2013]超级跳马 动态规划/递推式/矩阵快速幂优化

    这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你 ...

  2. P1067Warcraft III 守望者的烦恼(十大矩阵问题之七求递推式)

    https://vijos.org/p/1067 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫“闪烁”,这个技能可以把她 ...

  3. 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) + ...

  4. Tyche 2191 WYF的递推式

    题目描述 WYF手中有这样一条递推式 WYF并不是想让你帮他做出结果,事实上,给定一个n,他能够迅速算出Fn.WYF只是想单纯的考验一下读者们. 输入描述 仅一行,三个整数N,F1,P 输出描述 仅一 ...

  5. 【模板】BM + CH(线性递推式的求解,常系数齐次线性递推)

    这里所有的内容都将有关于一个线性递推: $f_{n} = \sum\limits_{i = 1}^{k} a_{i} * f_{n - i}$,其中$f_{0}, f_{1}, ... , f_{k ...

  6. 51nod1149 Pi的递推式

    基准时间限制:1 秒 空间限制:131072 KB 分值: 640 F(x) = 1 (0 <= x < 4) F(x) = F(x - 1) + F(x - pi) (4 <= x ...

  7. HDU5950 Recursive sequence 非线性递推式 矩阵快速幂

    题目传送门 题目描述:给出一个数列的第一项和第二项,计算第n项. 递推式是 f(n)=f(n-1)+2*f(n-2)+n^4. 由于n很大,所以肯定是矩阵快速幂的题目,但是矩阵快速幂只能解决线性的问题 ...

  8. POJ 3734 Blocks(矩阵快速幂+矩阵递推式)

    题意:个n个方块涂色, 只能涂红黄蓝绿四种颜色,求最终红色和绿色都为偶数的方案数. 该题我们可以想到一个递推式 .   设a[i]表示到第i个方块为止红绿是偶数的方案数, b[i]为红绿恰有一个是偶数 ...

  9. 【瞎讲】 Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18)

    [背诵瞎讲] Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18) 看CSP看到一题"线性递推式",不会做,去问了问zsy怎么做,他并 ...

随机推荐

  1. 在Window和Linux下使用Zthread库(跨平台高级面向对象的线性和sycnchronization 库)

    ZThread库是一个开源的跨平台高级面向对象的线性和sycnchronization 库,以运行POSIX 和Win32 系统中的C++程序. ZThread库的主页:http://zthread. ...

  2. spring boot之actuator简介

    当我们的开发工作进入尾声,部署上线之后,对于一个程序而言,可能才刚刚开始,对程序的运行情况的监控要伴随着整个生命周期. 如果这个工作由程序员自己来开发,也未尝不可,但本着不重复制造轮子的思想,我们尽量 ...

  3. 分布式数据库中间件 MyCat 搞起来!

    关于 MyCat 的铺垫文章已经写了三篇了: MySQL 只能做小项目?松哥要说几句公道话! 北冥有 Data,其名为鲲,鲲之大,一个 MySQL 放不下! What?Tomcat 竟然也算中间件? ...

  4. 03 Javascript的数据类型

    数据类型包括:基本数据类型和引用数据类型 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象. 当我们把变量赋值给一个变量时,解析器首先要确认的就是这个值是基本类型值还是引用类型值 ...

  5. spring boot + druid + mybatis + atomikos 多数据源配置 并支持分布式事务

    文章目录 一.综述 1.1 项目说明 1.2 项目结构 二.配置多数据源并支持分布式事务 2.1 导入基本依赖 2.2 在yml中配置多数据源信息 2.3 进行多数据源的配置 三.整合结果测试 3.1 ...

  6. spring 5.x 系列第6篇 —— 整合 mybatis + druid 连接池 (代码配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 项目目录结构 1.创建maven工程,除了Spring基本依赖外,还需要导 ...

  7. 基于cxf开发的WebService

    Node.jshttps://www.cnblogs.com/goldlong/p/8027997.htmlQQ音乐apihttps://juejin.im/post/5a35228e51882506 ...

  8. Vue SSR初探

    因为之前用nuxt开发过应用程序,但是nuxt早就达到了开箱即用的目的,所以一直对vue ssr的具体实现存在好奇. 构建步骤 我们通过上图可以看到,vue ssr 也是离不开 webpack 的打包 ...

  9. jenkin+Git子模块自动拉取代码

    jenkins+Git子模块自动拉取代码 添加Git子模块 先克隆想要添加子模块的仓库git clone ssh://git@ip:port/user/project.git,这个是主目录. 进入仓库 ...

  10. 18 | 眼前一亮:带你玩转GUI自动化的测试报告