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怎么做,他并 ...
随机推荐
- Tensorflow进阶
第一章 图像领域,第\(i\)类图片提取到的特征: \[ feature_i=\sum_jw_{i,j}x_j+b_i \] 其中,\(j\)表示一张图片的第\(j\)个像素,\(b_i\)是偏置值( ...
- DateTimeToGreenUnix
@暗夜魔尊 { Unix date conversion support with time-zone detect } function DateTimeToGreenUnix(const AVal ...
- ACL 我为什么要发明一个轮子?
现在成熟的开发库与开发框架有很多,所以平时我们在开发自己的应用程序时一般直接拿来用就可以了,所以当我先是开发出 C 语言版的 acl 框架库时有人认为是这个轮子是否值得发明,而当我再开发出基于 acl ...
- Google C++测试框架系列入门篇:第三章 基本概念
上一篇:Google C++测试框架系列入门篇:第二章 开始一个新项目 原始链接:Basic Concepts 词汇表 版本号:v_0.1 基本概念 使用GTest你肯定会接触到断言这个概念.断言是用 ...
- 一个基于jQuery写的弹窗效果(附源码)
最近项目中频繁遇到需要弹出窗口的功能,一直使用浏览器默认的Alert和Confirm弹窗,感觉视觉效果不是那么好,而从网上下载的话又找不到合适的,找到的话有些也是十分臃肿,有时候感觉学习配置的功夫自己 ...
- 利用GitLab自动同步软件仓库
利用GitLab自动同步GitHub.Gitee.Bitbucket软件仓库 我在码云的账号:userName密码:password项目地址:https://gitee.com/Bytom/bytom ...
- 十分钟了解Kubernetes
何为Kubernetes? 最简单的一句话来概括Kubernetes. 它就是一套成熟的商用服务编排解决方案.Kubernetes定位在Saas层,重点解决了微服务大规模部署时的服务编排问题. Kub ...
- js与原生进行交互
由于最近做的项目我作为web前端要和原生开发者合作,所以就去踩了踩坑. 这个功能是在h5页面上点击按钮关闭当前页面. function click_fn() { var u = navigator.u ...
- asyncio源码分析之基本执行流程
基于async关键字的原生协程 # 定义一个简单的原生协程cor async def cor(): print('enter cor') print('exit cor') print(type(co ...
- C++ 洛谷 P1273 有线电视网 题解
P1273 有线电视网 很明显,这是一道树形DP(图都画出来了,还不明显吗?) 未做完,持续更新中…… #include<cstdio> #include<cstring> ...