FFT模板
来源:互联网 发布:principle软件 编辑:程序博客网 时间:2024/06/02 06:49
FFT模板确实不太好写,虽然看思想比较快,但是一看代码依旧一脸茫然
FFT主要是利用了DFT二进制的性质来进行奇技淫巧的转换
还是把写的模板贴下(抄的大神的2333333)
#include <stdio.h>#include <string.h>#include <math.h>#include <algorithm>#define pi acos(-1.0)using namespace std;const int maxn=400007;struct complex{double r,i;complex(double real=0.0,double image=0.0){r=real,i=image;}complex operator + (complex a1){return complex(r+a1.r,i+a1.i);}complex operator - (complex a1){return complex(r-a1.r,i-a1.i);}complex operator * (complex a1){return complex(r*a1.r-i*a1.i,r*a1.i+i*a1.r);}}x1[maxn],x2[maxn]; char a[maxn/2],b[maxn/2];int sum[maxn];int vis[maxn];void brc(complex *a,int l){memset(vis,0,sizeof(vis));for(int i=1;i<l-1;i++){int x=i,y=0;if(vis[x]) continue;int m=(int)log2(l)+0.1;while(m--){y<<=1;y|=(x&1);x>>=1;}vis[i]=vis[y]=1;swap(a[i],a[y]);}}void fft(complex *a,int l,double on){complex u,t;brc(a,l);for(int h=2;h<=l;h<<=1){complex wn(cos(on*2*pi/h),sin(on*2*pi/h));for(int j=0;j<l;j+=h){complex w(1,0);for(int k=j;k<j+h/2;k++){u=a[k];t=w*a[k+h/2];a[k]=u+t;a[k+h/2]=u-t;w=w*wn;}}}if(on==-1) for(int i=0;i<l;i++) a[i].r/=l;}int main(){scanf("%s%s",a,b);int l1=strlen(a),l2=strlen(b);int l=1;while(l<l1*2||l<l2*2) l<<=1;for(int i=0;i<l1;i++){x1[i].r=a[l1-i-1]-'0';x1[i].i=0.0;}for(int i=l1;i<l;i++)x1[i].r=x1[i].i=0.0;for(int i=0;i<l2;i++){x2[i].r=b[l2-i-1]-'0';x2[i].i=0.0;}for(int i=l2;i<l;i++) x2[i].r=x2[i].i=0.0;fft(x1,l,1);fft(x2,l,1);for(int i=0;i<l;i++) x1[i]=x1[i]*x2[i];fft(x1,l,-1);for(int i=0;i<l;i++) sum[i]=x1[i].r+0.5;for(int i=0;i<l;i++){sum[i+1]+=sum[i]/10;sum[i]%=10;}l=l1+l2-1;while(sum[l]<=0&&l) l--;for(int i=l;i>=0;i--) printf("%d",sum[i]);printf("\n");return 0;}
0 0
- (模板)FFT
- FFT模板
- FFT模板
- FFT模板
- FFT模板
- fft模板
- FFT模板
- FFT 模板
- FFT模板
- FFT模板
- FFT模板
- FFT模板
- 【模板】FFT
- FFT模板
- 【模板】FFT模板
- FFT乘法模板
- 高精度乘法FFT 模板
- [UOJ34]FFT && NTT 模板
- 冒泡排序的简单理解
- 04-树5 Root of AVL Tree
- POJ 2513 Colored Sticks
- sql server 分页
- 10.3内部类
- FFT模板
- 指针函数与函数指针
- 调试器gdb的简介与使用
- 自定义View
- spark-框架执行流程概况standalone模式
- C++常指针与指针常量
- 有趣的指针(一)
- 新手作业android三步走
- Linux中vim编辑器常用命令(持续更新)