fft模板 HDU 1402
1 // fft模板 HDU 1402 2 3 #include <iostream> 4 #include <cstdio> 5 #include <cstdlib> 6 #include <algorithm> 7 #include <vector> 8 #include <math.h> 9 #include <memory.h> 10 #include <bits/stdc++.h> 11 using namespace std; 12 #define LL long long 13 typedef pair<int,int> pii; 14 const LL inf = 0x3f3f3f3f; 15 const LL MOD =100000000LL; 16 const int N = 150010; 17 const double eps = 1e-8; 18 void fre() {freopen("in.txt","r",stdin);} 19 void freout() {freopen("out.txt","w",stdout);} 20 inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;} 21 22 23 const double PI = acos(-1.0); 24 //复数结构体 25 struct Complex{ 26 double r,i; 27 Complex(double _r = 0.0,double _i = 0.0){ 28 r = _r; i = _i; 29 } 30 Complex operator +(const Complex &b){ 31 return Complex(r+b.r,i+b.i); 32 } 33 Complex operator -(const Complex &b){ 34 return Complex(r-b.r,i-b.i); 35 } 36 Complex operator *(const Complex &b){ 37 return Complex(r*b.r-i*b.i,r*b.i+i*b.r); 38 } 39 }; 40 /* 41 * 进行FFT和IFFT前的反转变换。 42 * 位置i和 (i二进制反转后位置)互换 43 * len必须去2的幂 44 */ 45 void change(Complex y[],int len){ 46 int i,j,k; 47 for(i = 1, j = len/2;i < len-1; i++){ 48 if(i < j)swap(y[i],y[j]); 49 //交换互为小标反转的元素,i<j保证交换一次 50 //i做正常的+1,j左反转类型的+1,始终保持i和j是反转的 51 k = len/2; 52 while( j >= k){ 53 j -= k; 54 k /= 2; 55 } 56 if(j < k) j += k; 57 } 58 } 59 /* 60 * 做FFT 61 * len必须为2^k形式, 62 * on==1时是DFT,on==-1时是IDFT 63 */ 64 void fft(Complex y[],int len,int on){ 65 change(y,len); 66 for(int h = 2; h <= len; h <<= 1){ 67 Complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h)); 68 for(int j = 0;j < len;j+=h){ 69 Complex w(1,0); 70 for(int k = j;k < j+h/2;k++){ 71 Complex u = y[k]; 72 Complex t = w*y[k+h/2]; 73 y[k] = u+t; 74 y[k+h/2] = u-t; 75 w = w*wn; 76 } 77 } 78 } 79 if(on == -1) 80 for(int i = 0;i < len;i++) 81 y[i].r /= len; 82 } 83 84 Complex a[N],b[N]; 85 char s1[N/2],s2[N/2]; 86 int ans[N]; 87 int main(){ 88 while(~scanf("%s%s",s1,s2)){ 89 int len1=strlen(s1); 90 int len2=strlen(s2); 91 int l1=0,l2=0; 92 while((1<<l1)<len1) l1++; 93 while((1<<l2)<len2) l2++; 94 int len=(1<<(max(l1,l2)+1)); 95 for(int i=0;i<len;i++){ 96 if(i<len1) a[i]=Complex(s1[len1-i-1]-'0',0); 97 else a[i]=Complex(0,0); 98 if(i<len2) b[i]=Complex(s2[len2-i-1]-'0',0); 99 else b[i]=Complex(0,0); 100 } 101 fft(a,len,1); 102 fft(b,len,1); 103 for(int i=0;i<len;i++) 104 a[i]=a[i]*b[i]; 105 fft(a,len,-1); 106 for(int i=0;i<len;i++) 107 ans[i]=(int)(a[i].r+0.5); 108 for(int i=0;i<len-1;i++){ 109 ans[i+1]+=ans[i]/10; 110 ans[i]%=10; 111 } 112 bool flag=false; 113 for(int i=len-1;i>=0;i--){ 114 if(ans[i]) printf("%d",ans[i]),flag=true; 115 else if(flag||i==0)printf("0"); 116 } 117 printf("\n"); 118 } 119 return 0; 120 }