zoukankan      html  css  js  c++  java
  • 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
    1 2 1000 2
    Sample Output
    2 2000
    初学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('
    ');
    107     }
    108     return 0;
    109 }
  • 相关阅读:
    Centos配置Apache phpadmin环境
    Linux添加FTP用户并设置权限
    Java中的过滤器
    【eclipse】注释模版
    [ci db操作]
    给vmware的Linux虚拟机添加硬盘
    基于LVDS/M-LVDS的数据通信
    如何找回丢失的硬盘分区表?
    vc++怎么可以直接刷掉MBR?搞笑的吧
    EFI、UEFI、MBR、GPT的区别
  • 原文地址:https://www.cnblogs.com/Stomach-ache/p/3921201.html
Copyright © 2011-2022 走看看