zoukankan      html  css  js  c++  java
  • HDU1042 A * B Problem Plus

    A * B Problem Plus

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


    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
     

    分析

    一直不过,最后发现数组开小了qwq。

    思路:把每个数分解成多项式

    $n = a_0*10^0+a_1*10^1+...a_k*10^k$

    然后多项式乘法,FFT模板题。

    code 

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<iostream>
     6 
     7 using namespace std;
     8 
     9 const int N = 200100;
    10 const double pi = acos(-1.0);
    11 char a[N],b[N];
    12 int ans[N]; //数组大小!
    13 
    14 struct Complex{
    15     double x,y;
    16     Complex() {x=0,y=0;}
    17     Complex(double _x,double _y) {x = _x,y = _y;}
    18 }A[N],B[N];
    19 Complex operator + (Complex a,Complex b) {
    20     return Complex(a.x+b.x,a.y+b.y);
    21 }
    22 Complex operator - (Complex a,Complex b) {
    23     return Complex(a.x-b.x,a.y-b.y);
    24 }
    25 Complex operator * (Complex a,Complex b) {
    26     return Complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
    27 }
    28 void FFT(Complex *a,int n,int ty) {
    29     for (int i=0,j=0; i<n; ++i) {
    30         if (i < j) swap(a[i],a[j]);
    31         for (int k=n>>1; (j^=k)<k; k>>=1); //妙啊!!!
    32     }
    33     for (int m=2; m<=n; m<<=1) {
    34         Complex w1 = Complex(cos(2*pi/m),ty*sin(2*pi/m));
    35         for (int i=0; i<n; i+=m) {
    36             Complex w = Complex(1,0);
    37             for (int k=0; k<(m>>1); ++k) {
    38                 Complex t = w * a[i+k+(m>>1)];
    39                 a[i+k+(m>>1)] = a[i+k] - t;
    40                 a[i+k] = a[i+k] + t;
    41                 w = w * w1;
    42             }
    43         }
    44     }
    45 }
    46 int main () {
    47     while (scanf("%s%s",a,b)!=EOF) {
    48         int len1 = strlen(a),len2 = strlen(b);
    49         int n = 1;
    50         while (n < (len1+len2)) n <<= 1;
    51         for (int i=0; i<n; ++i) {
    52             if (i < len1) A[i] = Complex(a[len1-i-1]-'0',0);
    53             else A[i] = Complex(0,0);
    54             if (i < len2) B[i] = Complex(b[len2-i-1]-'0',0);
    55             else B[i] = Complex(0,0);
    56         }
    57         FFT(A,n,1);
    58         FFT(B,n,1);
    59         for (int i=0; i<n; ++i) A[i] = A[i] * B[i];
    60         FFT(A,n,-1);
    61         for (int i=0; i<n; ++i) 
    62             ans[i] = (int)(A[i].x/n+0.5);
    63         for (int i=0; i<n-1; ++i) {
    64             ans[i+1] += (ans[i]/10);
    65             ans[i] %= 10;
    66         }
    67         bool fir = false;
    68         for (int i=n-1; i>=0; --i) {
    69             if (ans[i]) printf("%d",ans[i]),fir = true;
    70             else if (fir || i==0) printf("0");
    71         }
    72         puts("");
    73     }
    74     return 0;
    75 }
  • 相关阅读:
    VysorPro助手
    Play 2D games on Pixel running Android Nougat (N7.1.2) with Daydream View VR headset
    Play 2D games on Nexus 6P running Android N7.1.1 with Daydream View VR headset
    Native SBS for Android
    ADB和Fastboot最新版的谷歌官方下载链接
    How do I install Daydream on my phone?
    Daydream Controller手柄数据的解析
    蓝牙BLE传输性能及延迟分析
    VR(虚拟现实)开发资源汇总
    Android(Java)控制GPIO的方法及耗时分析
  • 原文地址:https://www.cnblogs.com/mjtcn/p/8454477.html
Copyright © 2011-2022 走看看