快速傅里叶变换
Posted GFY
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速傅里叶变换相关的知识,希望对你有一定的参考价值。
bzoj2179
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<string> 6 #include<algorithm> 7 #include<complex> 8 #define N 250005 9 using namespace std; 10 typedef complex<double> cd; 11 int a[N],b[N],c[N],lc,n; 12 char s[N]; 13 double PI=acos(-1); 14 int bitrev(int t,int n){ 15 int res=0; 16 for (int i=0;i<n;i++) res|=(t>>(n-i-1)&1)<<i; 17 return res; 18 } 19 void fft(cd *a,int n,int rev){ 20 static cd y[N]; 21 int len=1<<n; 22 for (int i=0;i<len;i++) y[i]=a[bitrev(i,n)]; 23 for (int d=1;d<len;d<<=1){ 24 cd wn(exp(cd(0,PI*rev/d))); 25 for (int k=0;k<len;k+=d*2){ 26 cd w(1,0); 27 for (int i=k;i<d+k;i++,w*=wn){ 28 cd u=y[i],v=w*y[i+d]; 29 y[i]=u+v; 30 y[i+d]=u-v; 31 } 32 } 33 } 34 if (rev==-1) 35 for (int i=0;i<len;i++) y[i]/=len; 36 for (int i=0;i<len;i++) a[i]=y[i]; 37 } 38 void mul(int *a,int la,int *b,int lb,int *c,int &lc){ 39 static cd t1[N],t2[N]; 40 int len=1,n=0; 41 for (;len<la*2||len<lb*2;len*=2,n++); 42 for (int i=0;i<la;i++) t1[i]=cd(a[i],0); 43 for (int i=0;i<lb;i++) t2[i]=cd(b[i],0); 44 for (int i=la;i<len;i++) t1[i]=cd(0,0); 45 for (int i=lb;i<len;i++) t2[i]=cd(0,0); 46 fft(t1,n,1); 47 fft(t2,n,1); 48 for (int i=0;i<len;i++) t1[i]*=t2[i]; 49 fft(t1,n,-1); 50 lc=len; 51 for (int i=0;i<len;i++) c[i]=(int)(t1[i].real()+0.5); 52 } 53 int main(){ 54 scanf("%d",&n); 55 scanf("%s",s); 56 for (int i=0;i<n;i++) a[i]=s[n-i-1]-‘0‘; 57 scanf("%s",s); 58 for (int i=0;i<n;i++) b[i]=s[n-i-1]-‘0‘; 59 mul(a,n,b,n,c,lc); 60 for (int i=0;i<lc;i++) c[i+1]+=c[i]/10,c[i]%=10; 61 for (--lc;lc&&!c[lc];lc--); 62 for (int i=lc;i>=0;i--) printf("%d",c[i]); 63 }
G_word:只要背模板就行了233
以上是关于快速傅里叶变换的主要内容,如果未能解决你的问题,请参考以下文章