首页 > 代码库 > Hdu 1402 (FFT)

Hdu 1402 (FFT)

题目链接

A * B Problem Plus

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 12490    Accepted Submission(s): 2206


Problem Description
Calculate A * B.

 

Input
Each line will contain two integers A and B. Process to end of file.

Note: the length of each integer will not exceed 50000.

 

Output
For each case, output A * B in one line.

 

Sample Input
1210002

 

Sample Output
22000
初学FFT,根本不懂怎么实现的。直接套模板
Accepted Code:
  1 #include <string>  2 #include <vector>  3 #include <algorithm>  4 #include <numeric>  5 #include <set>  6 #include <map>  7 #include <queue>  8 #include <iostream>  9 #include <sstream> 10 #include <cstdio> 11 #include <cmath> 12 #include <ctime> 13 #include <cstring> 14 #include <cctype> 15 #include <cassert> 16 #include <limits> 17 #include <bitset> 18 #include <complex> 19 #define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i)) 20 #define rer(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i)) 21 #define reu(i,l,u) for(int (i)=(int)(l);(i)<(int)(u);++(i)) 22 #define all(o) (o).begin(), (o).end() 23 #define rall(o) (o).rbegin(), ((o).rend()) 24 #define pb(x) push_back(x) 25 #define mp(x,y) make_pair((x),(y)) 26 #define mset(m,v) memset(m,v,sizeof(m)) 27 #define INF 0x3f3f3f3f 28 #define INFL 0x3f3f3f3f3f3f3f3fLL 29 using namespace std; 30 typedef vector<int> vi; typedef pair<int,int> pii; typedef vector<pair<int,int> > vpii; 31 typedef long long ll; typedef vector<long long> vl; typedef pair<long long,long long> pll; typedef vector<pair<long long,long long> > vpll; 32 typedef vector<string> vs; typedef long double ld; 33 template<typename T, typename U> inline void amin(T &x, U y) { if(y < x) x = y; } 34 template<typename T, typename U> inline void amax(T &x, U y) { if(x < y) x = y; } 35  36 typedef long double Num;    //??????long double????? 37 const Num PI = 3.141592653589793238462643383279L; 38 typedef complex<Num> Complex; 39 //n????? 40 //a????? 41 void fft_main(int n, Num theta, Complex a[]) { 42     for(int m = n; m >= 2; m >>= 1) { 43         int mh = m >> 1; 44         Complex thetaI = Complex(0, theta); 45         rep(i, mh) { 46             Complex w = exp((Num)i*thetaI); 47             for(int j = i; j < n; j += m) { 48                 int k = j + mh; 49                 Complex x = a[j] - a[k]; 50                 a[j] += a[k]; 51                 a[k] = w * x; 52             } 53         } 54         theta *= 2; 55     } 56     int i = 0; 57     reu(j, 1, n-1) { 58     for(int k = n >> 1; k > (i ^= k); k >>= 1) ; 59         if(j < i) swap(a[i], a[j]); 60     } 61 } 62  63 void fft(int n, Complex a[]) { fft_main(n, 2 * PI / n, a); } 64 void inverse_fft(int n, Complex a[]) { fft_main(n, -2 * PI / n, a); } 65  66 void convolution(vector<Complex> &v, vector<Complex> &w) { 67     int n = 1, vwn = v.size() + w.size() - 1; 68     while(n < vwn) n <<= 1; 69     v.resize(n), w.resize(n); 70     fft(n, &v[0]); 71     fft(n, &w[0]); 72     rep(i, n) v[i] *= w[i]; 73     inverse_fft(n, &v[0]); 74     rep(i, n) v[i] /= n; 75 } 76  77 const int maxn = 50005; 78 vector<int> ans; 79 char s1[maxn], s2[maxn]; 80  81 void solve(vector<int> &res) {     82     //cerr << s1 << s2; 83     int len1 = strlen(s1), len2 = strlen(s2); 84     for (int i = 0; i < len1; i++) s1[i] -= 0; 85     for (int i = 0; i < len2; i++) s2[i] -= 0; 86     vector<Complex> Lc(len1), Rc(len2); 87     for (int i = 0; i < len1; i++) Lc[i] = Complex(s1[len1-i-1], 0); 88     for (int i = 0; i < len2; i++) Rc[i] = Complex(s2[len2-i-1], 0); 89     convolution(Lc, Rc); 90     int n = len1 + len2 - 1; 91     res.resize(n); 92     rep(i, n) res[i] = Lc[i].real() + .5; 93 } 94  95 int main(void) { 96     while (~scanf("%s %s", s1, s2)) { 97         solve(ans); 98         ans.resize(ans.size() << 1); 99         for (int i = 0; i < ans.size(); i++) {100             ans[i+1] += ans[i] / 10;101             ans[i] %= 10;102         }103         int high = ans.size() - 1;104         while (high > 0 && !ans[high]) high--;105         for (int i = high; i >= 0; i--) putchar(ans[i] + 0);106         putchar(\n);107     }108     return 0;109 }