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怎么做,他并 ...
随机推荐
- Entity Framework的查询
Entity Framework是个好东西,虽然没有Hibernate功能强大,但使用更简便.今天整理一下常见SQL如何用EF来表达,Func形式和Linq形式都会列出来(本人更喜欢Func形式). ...
- Qt编程规范
一.概述 良好的编程规范可以大幅提高一个程序的可读性.可理解性和可维护性. 本规范参考Effective C++中文版.Google C++编码规范及Qt编码风格. 二.头文件 1) #de ...
- Windows完成端口编程
Windows完成端口编程目录一 基本概念二 OVERLAPPED数据结构三 完成端口的内部机制创建完成端口完成端口线程的工作原理线程间数据传递线程的安全退出 一 基本概念 设备---wi ...
- Qt 设置背景图片3种方法(三种方法:QPalette调色板,paintEvent,QSS)
方法1. setStylSheet{"QDialog{background-image:url()"}} //使用styleSheet 这种方法的好处是继承它的dialog都会自 ...
- 可以用变量指定大小的Bits对象实现
c++的容器中有位对象bitset,但是个人认为最大的问题是定义是必须指定常数大小,比如 bitset<3> bit; 无法实现 int n = 3; bitset<n> bi ...
- 全自动Landsat影像温度反演软件开发
许久没有更新遥感类软件开发了,都有点生疏了,这一次我带来了一个老的算法,新的东西, 为什么这么说呢,我们知道Landat8.Landsat5等影像,单个影像去做温度反演,并没有什么太大的难度, 但是呢 ...
- Shell学习笔记1》转载自runnoob
无论是shell 还是bat,都是与操作系统结合非常紧密的东西,所以在此占坑,希望有朝一日能够把这些东西融会贯通,于是在此占坑~ 学习地址:http://www.runoob.com/linux/li ...
- 微信jssdk支付坑
1.使用easywechat开发的时候,由于没有注意,配置文件中默认的请求地址是 https://api.weixin.qq.com/结果调试了半天,一直报错“40066” 这也是怪自己粗心,结果去分 ...
- MySQL下的DB Link
前言: 在实际工作中,我们可能会遇到需要操作其他数据库实例的部分表,但又不想系统连接多库.此时我们就需要用到数据表映射.如同Oracle中的DBlink一般,使用过Oracle DBlink数据库链接 ...
- javascript中中文转码的方法
js对文字进行编码涉及3个函数: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent ...