题意:大数乘法

思路:FFT模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/* ******************************************************************************** */
#include <iostream>                                                                 //
#include <cstdio>                                                                   //
#include <cmath>                                                                    //
#include <cstdlib>                                                                  //
#include <cstring>                                                                  //
#include <vector>                                                                   //
#include <ctime>                                                                    //
#include <deque>                                                                    //
#include <queue>                                                                    //
#include <algorithm>                                                                //
#include <map>                                                                      //
#include <cmath>                                                                    //
using namespace std;                                                                //
                                                                                    //
#define pb push_back                                                                //
#define mp make_pair                                                                //
#define X first                                                                     //
#define Y second                                                                    //
#define all(a) (a).begin(), (a).end()                                               //
#define foreach(a, i) for (typeof(a.begin()) i = a.begin(); i != a.end(); ++ i)     //
#define foreach(a, n, i) for(typeof(*a) *i = a; i < a + n; i ++)                    //
#define fillchar(a, x) memset(a, x, sizeof(a))                                      //
                                                                                    //
void RI(vector<int>&a,int n){a.resize(n);for(int i=0;i<n;i++)scanf("%d",&a[i]);}    //
void RI(){}void RI(int&X){scanf("%d",&X);}template<typename...R>                    //
void RI(int&f,R&...r){RI(f);RI(r...);}void RI(int*p,int*q){int d=p<q?1:-1;          //
while(p!=q){scanf("%d",p);p+=d;}}void print(){cout<<endl;}template<typename T>      //
void print(const T t){cout<<t<<endl;}template<typename F,typename...R>              //
void print(const F f,const R...r){cout<<f<<", ";print(r...);}template<typename T>   //
void print(T*p, T*q){int d=p<q?1:-1;while(p!=q){cout<<*p<<", ";p+=d;}cout<<endl;}   //
                                                                                    //
typedef pair<intint> pii;                                                         //
typedef long long ll;                                                               //
typedef unsigned long long ull;                                                     //
                                                                                    //
template<typename T>bool umax(T&a, const T&b){return b>a?false:(a=b,true);}         //
template<typename T>bool umin(T&a, const T&b){return b<a?false:(a=b,true);}         //
template<typename T>                                                                //
void V2A(T a[],const vector<T>&b){for(int i=0;i<b.size();i++)a[i]=b[i];}            //
template<typename T>                                                                //
void A2V(vector<T>&a,const T b[]){for(int i=0;i<a.size();i++)a[i]=b[i];}            //
                                                                                    //
const double PI = acos(-1);                                                         //
                                                                                    //
/* -------------------------------------------------------------------------------- */
 
namespace FFT {
    const static int maxn = 5e4 + 7;
    #define L(x) (1 << (x))
    double ax[maxn << 2], ay[maxn << 2], bx[maxn << 2], by[maxn << 2];//需要四倍空间
    int revv(int x, int bits) {
        int ret = 0;
        for (int i = 0; i < bits; i++) {
            ret <<= 1;
            ret |= x & 1;
            x >>= 1;
        }
        return ret;
    }
    void fft(double * a, double * b, int n, bool rev) {
        int bits = 0;
        while (1 << bits < n) ++bits;
        for (int i = 0; i < n; i++) {
            int j = revv(i, bits);
            if (i < j)
                swap(a[i], a[j]), swap(b[i], b[j]);
        }
        for (int len = 2; len <= n; len <<= 1) {
            int half = len >> 1;
            double wmx = cos(2 * PI / len), wmy = sin(2 * PI / len);
            if (rev) wmy = -wmy;
            for (int i = 0; i < n; i += len) {
                double wx = 1, wy = 0;
                for (int j = 0; j < half; j++) {
                    double cx = a[i + j], cy = b[i + j];
                    double dx = a[i + j + half], dy = b[i + j + half];
                    double ex = dx * wx - dy * wy, ey = dx * wy + dy * wx;
                    a[i + j] = cx + ex, b[i + j] = cy + ey;
                    a[i + j + half] = cx - ex, b[i + j + half] = cy - ey;
                    double wnx = wx * wmx - wy * wmy, wny = wx * wmy + wy * wmx;
                    wx = wnx, wy = wny;
                }
            }
        }
        if (rev) {
            for (int i = 0; i < n; i++)
                a[i] /= n, b[i] /= n;
        }
    }
    int solve(int a[], int na, int b[], int nb, int ans[]) {
        int len = max(na, nb), ln;
        for(ln = 0; L(ln) < len; ++ln);
        len = L(++ln);
        for (int i = 0; i < len ; ++i) {
            if (i >= na) ax[i] = 0, ay[i] = 0;
            else ax[i] = a[i], ay[i] = 0;
        }
        fft(ax, ay, len, 0);
        for (int i = 0; i < len; ++i) {
            if (i >= nb) bx[i] = 0, by[i] = 0;
            else bx[i] = b[i], by[i] = 0;
        }
        fft(bx, by, len, 0);
        for (int i = 0; i < len; ++i) {
            double cx = ax[i] * bx[i] - ay[i] * by[i];
            double cy = ax[i] * by[i] + ay[i] * bx[i];
            ax[i] = cx, ay[i] = cy;
        }
        fft(ax, ay, len, 1);
        for (int i = 0; i < len; ++i)
            ans[i] = (int)(ax[i] + 0.5);
        return len;
    }
    #undef L(x)
}
const int maxn = 5e4 + 7;
char s1[maxn], s2[maxn];
int x[maxn], y[maxn], ans[maxn << 2];
 
int main() {
#ifndef ONLINE_JUDGE
    freopen("in.txt""r", stdin);
#endif // ONLINE_JUDGE
    while (~scanf("%s", s1)) {
        scanf("%s", s2);
        int len1 = strlen(s1), len2 = strlen(s2);
        for (int i = 0; i < len1; i ++) x[i] = s1[len1 - i - 1] - '0';
        for (int i = 0; i < len2; i ++) y[i] = s2[len2 - i - 1] - '0';
        fillchar(ans, 0);
        int len = FFT::solve(x, len1, y, len2, ans), i;
        for (i = 0; i < len || ans[i] >= 10; i ++) {
            ans[i + 1] += ans[i] / 10;
            ans[i] %= 10;
        }
        len = i;
        while (ans[len] <= 0 && len) len --;
        for (int i = len; i >= 0; i --) putchar(ans[i] + '0');
        puts("");
    }
    return 0;
}
/* ******************************************************************************** */

最新文章

  1. 监督学习 VS 无监督学习
  2. BZOJ 4205: 卡牌配对
  3. JavaScript高级程序设计-(3) 变量、作用域和内存问题
  4. COCOS2D-X中UI动画导致闪退与UI动画浅析
  5. 【译】RabbitMQ:远程过程调用(RPC)
  6. 提高Vector容器的删除效率
  7. XML 之 与Json或String的相互转换
  8. TCP/IP 中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议
  9. C#List&lt;long&gt;与String(Linq)
  10. websocket(二) websocket的简单实现,识别用户属性的群聊
  11. Redis的知识点总结~Linux系统操作~
  12. 2.1命令行和JSON的配置「深入浅出ASP.NET Core系列」
  13. 折腾Java设计模式之状态模式
  14. ln -s软链接文件算文件吗
  15. Python day 05
  16. Spring的AOP基于AspectJ的注解方式开发3
  17. 【Nowcoder71E】组一组(差分约束,最短路)
  18. MySql Scaffolding an Existing Database in EF Core
  19. java实现解压zip文件,(亲测可用)!!!!!!
  20. Weblogic 错误 &lt;BEA-000403&gt; &lt;BEA-000438&gt;解决办法

热门文章

  1. [php]微信测试号调取acces_token,自定义菜单以及被动响应消息
  2. 从零开始建图床 minio
  3. Python爬虫入门(基础实战)—— 模拟登录知乎
  4. mysql5.7免安装版配置
  5. C#多线程(14):任务基础②
  6. Android--sos闪光灯
  7. MySQL系列(一)
  8. mysql 之 清空表中数据
  9. Python语言类型
  10. JS省城级联