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
| #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define sqz main #define ll long long #define rep(i, a, b) for (int i = (a); i <= (b); i++) #define per(i, a, b) for (int i = (a); i >= (b); i--) #define Rep(i, a, b) for (int i = (a); i < (b); i++) #define travel(i, u) for (int i = head[u]; ~i; i = edge[i].next)
const ll INF = 1e9, Mo = INF + 7; const int N = 132000; const double eps = 1e-6, pi = acos(-1.0); ll read() { ll x = 0; int zf = 1; char ch = getchar(); while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar(); if (ch == '-') zf = -1, ch = getchar(); while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); return x * zf; } void write(ll y) { if (y < 0) putchar('-'), y = -y; if (y > 9) write(y / 10); putchar(y % 10 + '0'); }
int T[N + 5], Rev[N + 5]; char s[N + 5]; struct Complex { double real, imagine; Complex (double _real = 0, double _imagine = 0) { real = _real, imagine = _imagine;} Complex operator +(const Complex X) { return Complex(real + X.real, imagine + X.imagine); } Complex operator -(const Complex X) { return Complex(real - X.real, imagine - X.imagine); } Complex operator *(const Complex X) { return Complex(real * X.real - imagine * X.imagine, real * X.imagine + imagine * X.real); } }X[N + 5], Y[N + 5];
void FFT(Complex *T, int n, int op) { Rep(i, 0, n) if (i > Rev[i]) swap(T[i], T[Rev[i]]); for (int Size = 1; Size < n; Size <<= 1) { Complex wn = Complex(cos(pi / Size), sin(pi / Size) * op); for (int L = 0; L < n; L += (Size << 1)) { Complex w = Complex(1, 0); Rep(R, L, L + Size) { Complex x = T[R], y = w * T[R + Size]; T[R] = x + y, T[R + Size] = x - y; w = w * wn; } } } }
int sqz() { int n = read() - 1; int x = n * 2; scanf("%s", s); rep(i, 0, n) X[i] = s[n - i] - '0'; scanf("%s", s); rep(i, 0, n) Y[i] = s[n - i] - '0'; int t, l = 0; for (t = 1; t <= x; t <<= 1) l++; Rep(i, 0, t) Rev[i] = (Rev[i >> 1] >> 1) + ((i & 1) << l - 1); FFT(X, t, 1); FFT(Y, t, 1); Rep(i, 0, t) X[i] = X[i] * Y[i]; FFT(X, t, -1); rep(i, 0, x) T[i] = (int)(X[i].real / t + 0.5); Rep(i, 0, x) if (T[i] >= 10) { T[i + 1] += T[i] / 10; T[i] %= 10; } if (T[x] >= 10) T[x + 1] += T[x] / 10, T[x] %= 10, x++; per(i, x, 0) printf("%d", T[i]); puts(""); return 0; }
|