FFT快速傅里叶变换-递归版-带注释模板
来源:互联网 发布:软件危机的例子 编辑:程序博客网 时间:2024/06/07 22:22
题链:uoj#34多项式乘法
题意:给你两个多项式,请输出乘起来后的多项式。
//打法照抄hyc并复制了部分注释
真·存模板系列
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>using namespace std;#define N 301000//!!! N>=2^18=262144>n+m>=200000const double pi=acos(-1);struct node{ double x,y; node(){x=y=0;} node(double x,double y):x(x),y(y){}}a[N],b[N];node operator + (node x,node y) {return node(x.x+y.x,x.y+y.y);}node operator - (node x,node y) {return node(x.x-y.x,x.y-y.y);}node operator * (node x,node y) {return node(x.x*y.x-x.y*y.y,x.x*y.y+x.y*y.x);}void fft(node *s,int n,int t)//t就是标记它是不是逆的FFT//(最后不是要从点值表达转回系数表达吗t=-1表示处理这个//用ωn^(-1)替换ωn 并将计算结果的每个元素除以n。{ if (n==1) return; node a0[n>>1],a1[n>>1]; for (int i=0;i<=n;i+=2) a0[i>>1]=s[i],a1[i>>1]=s[i+1]; fft(a0,n>>1,t);fft(a1,n>>1,t); node wn(cos(2*pi/n),t*sin(2*pi/n)),w(1,0);//就是ωn和ω //如果要算ωn^(-1)的话 根据负数的指数形式的定义e^(iu)=cos(u)+isin(u) //ωn^(-1)=e^(-2πi/n) 设u=2πi/n e^(-2πi/n)=cos(-u)+isin(-u)=cos(u)-isin(u) //所以如果反过来的话 让sin乘个t=-1就好了 for (int i=0;i<(n>>1);i++,w=w*wn) s[i]=a0[i]+w*a1[i],s[i+(n>>1)]=a0[i]-w*a1[i]; //w^2=(w+n/2)^2 均匀分布在圆上面 //w[i^2,n]=w[i/2,n/2] 折半引理 //s[i]=a0’(i^2)+i*a1’(i^2)=a0(i)+i*a1(i) //s[i+n/2]=a0’((i+n/2)^2)+i*a1’((i+n/2)^2)=a0’(i^2)-i*a1’(i^2) //因为i=-(i+n/2) 折半引理}int main(){ //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); int n,m,fn,i; scanf("%d%d",&n,&m); for (i=0;i<=n;i++) scanf("%lf",&a[i].x); for (i=0;i<=m;i++) scanf("%lf",&b[i].x); fn=1;while (fn<=n+m) fn<<=1; fft(a,fn,1);fft(b,fn,1); for (i=0;i<=fn;i++) a[i]=a[i]*b[i]; fft(a,fn,-1); for (i=0;i<=n+m;i++) printf("%d ",(int)(a[i].x/fn+0.5)); //强转int会自动向下取整 所以要加0.5让它四舍五入 printf("\n"); return 0;}
update2017/4/13
做FFT的时候看了看这个发现并不懂在写啥= =
于是我决定重写。。
写好了的话大概会单独弄个总结吧
0 0
- FFT快速傅里叶变换-递归版-带注释模板
- 【FFT快速傅里叶变换】【模板】
- 快速傅里叶变换 FFT 模板【bzoj2179】 FFT快速傅立叶
- NTT FFT 数论变换 快速傅里叶变换 模板
- 快速傅里叶变换(FFT)的C#实现及详细注释
- Java实现算法导论中快速傅里叶变换FFT递归算法
- 快速傅里叶变换算法原理简述 基于递归的fft实现
- 快速傅里叶变换(FFT)(ZZ)
- FFT快速傅里叶变换;
- 快速傅里叶变换(FFT)
- 关于FFT快速傅里叶变换
- FFT快速傅里叶变换
- FFT - 快速傅里叶变换
- 快速傅里叶变换(FFT)
- 快速傅里叶变换(FFT)
- GSL快速傅里叶变换FFT
- 快速傅里叶变换FFT
- 【数学】快速傅里叶变换(FFT)
- POJ-1180 Batch Scheduling 【逆向DP+斜率优化】
- 基于tensorflow的图片风格转换
- Mysql SQL查询今天、昨天、n天内、第n天
- ext4 ext4_fill_super
- LeetCode No.15 3Sum
- FFT快速傅里叶变换-递归版-带注释模板
- eclipse中安装properties插件(国际化使用)
- K-diff Pairs in an Array
- 从JobSchedulerService开始探究学习安卓framework层
- OC学习记录1:类方法与实例方法
- 庖丁解牛<c++primer>系列二:const关键字
- 20170305-java
- Mac在Finder直接打开iterm2并且定位到当前目录 ---------类似于git bash here
- Codeforces Round #210 (Div. 1) B. Levko and Array(dp 思维)