传送门:点击打开链接
题意:求大数乘法
思路:fft套模板
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <stack>
#include <queue>
#include <cstdio>
#include <cctype>
#include <bitset>
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
#define fuck(x) cout<<"["<<x<<"]";
#define FIN freopen("input.txt","r",stdin);
#define FOUT freopen("output.txt","w+",stdout);
//#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int MX = 3e5 + 5;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double pi = acos(-1.0);
struct cp {
double x, y;
cp() {}
cp (double x, double y): x(x), y(y) {}
inline cp operator + (const cp &b) {
return cp(x + b.x, y + b.y);
}
inline cp operator - (const cp &b) {
return cp(x - b.x, y - b.y);
}
inline cp operator * (const cp &b) {
return cp(x * b.x - y * b.y, x * b.y + y * b.x);
}
} a[MX], b[MX];
int r[MX], ans[MX];
void fft(cp a[], int opt, int n) {
for(int i = 0; i < n; i++) {
if(i < r[i]) swap(a[i], a[r[i]]);
}
for(int i = 1; i < n; i <<= 1) {
cp wn(cos(pi / i), opt * sin(pi / i));
for(int p = i << 1, j = 0; j < n; j += p) {
cp w(1, 0);
for(int k = 0; k < i; k++, w = wn * w) {
cp x = a[j + k], y = w * a[j + k + i];
a[j + k] = x + y; a[j + k + i] = x - y;
}
}
}
}
void solve(cp a[], cp b[], int n, int m) {
int l = 0, nn, nm = n + m;
for(nn = 1; nn <= nm; nn <<= 1) l++;
for(int i = n + 1; i <= nn; i++) a[i] = cp(0, 0);
for(int i = m + 1; i <= nn; i++) b[i] = cp(0, 0);
n = nn; m = nm;
for(int i = 0; i < n; i++) {
r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
}
fft(a, 1, n); fft(b, 1, n);
for(int i = 0; i <= n; i++) {
a[i] = a[i] * b[i];
}
fft(a, -1, n);
for(int i = 0; i <= m; i++) {
a[i].x /= n;
}
}
char A[MX], B[MX];
int main() {
//FIN;
while(~scanf("%s%s", A, B)) {
int n = strlen(A), m = strlen(B); n--; m--;
for(int i = 0; i <= n; i++) a[i] = cp(A[n - i] - '0', 0);
for(int i = 0; i <= m; i++) b[i] = cp(B[m - i] - '0', 0);
solve(a, b, n, m);
int sz = 0, add = 0;
for(sz = 0; add || sz <= n + m; sz++) {
int t = add;
if(sz <= n + m) t += a[sz].x + 0.5;
ans[sz] = t % 10;
add = t / 10;
}
while(sz - 1 > 0 && !ans[sz - 1]) sz--;
for(int i = sz - 1; i >= 0; i--) {
printf("%d", ans[i]);
}
printf("\n");
}
return 0;
}